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;
    }
    
  • 相关阅读:
    centos使用--排查服务是否可用
    centos使用--开机启动
    centos使用--防火墙
    centos使用--软件启动关闭等操作的命令
    centos使用--supervisor使用
    centos使用--centos7.3配置LNMP
    centos使用--vim配置和推荐插件使用
    centos使用--ssh登陆
    HTML5 sessionStorage会话存储
    localStorage使用
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998460.html
Copyright © 2011-2022 走看看