[Noip2018普及]摆渡车

Posted orzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Noip2018普及]摆渡车相关的知识,希望对你有一定的参考价值。

生涯回忆录彻底摸了。。。反正也没啥人看(

过几天要给普及组神犇讲课就寻思做一点普及题,然后差点被锤爆,,

题在luogu上找的https://www.luogu.org/problemnew/show/P5017,不贴了


首先考虑如果前后两个人等待时间相差超过$m$(往返时间),那一定不必等,因为中间完全可以送一趟。所以我们发现这个$4e6$的$t_i$的数据范围一定没用......而且时间肯定要排序一下啦。

所以这肯定要dp了,用f[i][j]表示前i个人全送走,且最后一班车让$i$等了$j$分钟,前$i$个人总共等了多久。那么f[i][j]可以转移到f[k][下一班车走的时间-$t_k$],表示下一班把$k$之前包括$k$的人送了。这里下一班车走的时间就是$f[i][j]$表示的发车时间$+m$和$t_k$取max。多花的时间用前缀和维护一下就行了。开始我没考虑第二维,太菜了。。

代码跑的还很慢,人菜常数大

#include<bits/stdc++.h>
using namespace std;
const int N=510;
const int inf=0x3f3f3f3f;
int f[N][N],a[N],s[N];
int main()
    memset(f,63,sizeof f);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    s[i]=s[i-1]+a[i];
    f[0][0]=0;a[0]=-inf;
    for(int i=0;i<=n;i++)
        for(int k=i+1;k<=n;k++)
            for(int j=0;j<m;j++)
                int t=max(a[k],a[i]+j+m);
                f[k][t-a[k]]=min(f[k][t-a[k]],f[i][j]+t*(k-i)-(s[k]-s[i]));
            
        
    
    int ans=inf;
    for(int j=0;j<m;j++)
    ans=min(ans,f[n][j]);
    cout<<ans<<endl;

 

以上是关于[Noip2018普及]摆渡车的主要内容,如果未能解决你的问题,请参考以下文章

[Noip 2018][标题统计 龙湖斗 摆渡车 对称二叉树]普及组题解

[OI]Noip 2018(普及组)总结

NOIP2006普及组开心的金明

2006NOIP普及组试题

急求NOIP2009普及组试题

noip2010普及组复赛接水问题