zoukankan      html  css  js  c++  java
  • 【NOIP2018】【洛谷P5017】摆渡车【DP】

    题目大意:

    题目链接:https://www.luogu.org/problemnew/show/P5017
    nn个人分别在t1tnt_1sim t_n的时间到达,一辆摆渡车要把这些人送到另外一个地方,摆渡车来回一次要mm的时间单位。求把这些人都送到的最短时间。


    思路:

    肯定可以先把tt排序。
    我们知道,一个人到达后发车只会有两种情况:

    1. 摆渡车在他到达之前就到了。此时可以直接发车。
    2. 摆渡车在他到达后kk分钟才到。此时要等kk分钟才能发车。

    可以先预处理出s[i][j]s[i][j],表示第ii个人到第jj个人做同一辆车的等待时间。那么就有
    s[i][j]=j=1ni=1j1k=ij1tjtks[i][j]=sum^{n}_{j=1}sum^{j-1}_{i=1}sum^{j-1}_{k=i}t_j-t_k
    那么我们就设f[i][j]f[i][j]表示在ii个人到达后发车,第ii个人等了jj分钟时的最小等待时间。
    那么肯定要枚举jj,表示前jj个人已经送到了目的地。
    那么如果第ii个人到达时,摆渡车已经回来了,那么就可以直接发车(即第ii个人的等待时间为00)。此时就有
    f[i][0]=min(f[i][0],f[j][k]+s[j+1][i])f[i][0]=min(f[i][0],f[j][k]+s[j+1][i])
    其中kk表示枚举的第jj个人等待的时间。
    那么如果第ii个人到达后摆渡车没有回来,那么第ii个人等待的时间就是
    w=tj+k+mtiw=t_j+k+m-t_i
    其中tj+k+mt_j+k+m是摆渡车回到的时间。
    那么就有
    f[i][w]=min(f[i][w],f[j][k]+s[j+1][i]+(ij)w)f[i][w]=min(f[i][w],f[j][k]+s[j+1][i]+(i-j)*w)
    答案就是min(f[n][i])(i=0m)min(f[n][i])(i=0sim m)
    时间复杂度O(n2m)O(n^2m),足够过掉本题。


    代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    const int N=510;
    const int M=210;
    const int Inf=2e9;
    int n,m,ans,w,t[N],f[N][M],s[N][N];
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++)
    		scanf("%d",&t[i]);
    	sort(t+1,t+1+n);
    	for (int j=1;j<=n;j++)
    		for (int i=1;i<j;i++)
    			for (int k=i;k<j;k++)
    				s[i][j]+=t[j]-t[k];
    	memset(f,0x3f3f3f3f,sizeof(f));
    	t[0]=-Inf;
    	for (int i=0;i<=m;i++)  //初始化
    	{
    		f[0][i]=0;
    		f[1][i]=i;
    	}
    	for (int i=2;i<=n;i++)
    		for (int j=0;j<i;j++)
    			for (int k=0;k<=m;k++)
    			{
    				w=t[j]+k+m-t[i];
    				if (w>0)
    					f[i][w]=min(f[i][w],f[j][k]+s[j+1][i]+(i-j)*w);
    				else
    					f[i][0]=min(f[i][0],f[j][k]+s[j+1][i]);
    			}
    	ans=Inf;
    	for (int i=0;i<=m;i++)
    		ans=min(ans,f[n][i]);
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Codeforces 1316B String Modification
    Codeforces 1305C Kuroni and Impossible Calculation
    Codeforces 1305B Kuroni and Simple Strings
    Codeforces 1321D Navigation System
    Codeforces 1321C Remove Adjacent
    Codeforces 1321B Journey Planning
    Operating systems Chapter 6
    Operating systems Chapter 5
    Abandoned country HDU
    Computer HDU
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998459.html
Copyright © 2011-2022 走看看