题目链接https://www.luogu.com.cn/problem/P5017
这道题我的思路主要是:
f[i]存储“若摆渡车在第i分钟出发,最少的等待时间”
代码中ti(a,b)是运用了前缀和的思想,计算“若摆渡车在第a分钟出发,在第b分钟多出的等待时间”
r[i][0]表示“若摆渡车不动,在第i分钟有多少人在等” r[i][1]表示“若摆渡车不动,在第i分钟的总等待时间”
为了节约空间,我把到达时间相邻,且相距时间超过m的全部压到m,因为摆渡车不可能m分钟一直不动
如下是我的55分代码,#11,#13-20是WA,且下过数据,答案只有1000多
#include<bits/stdc++.h>
using namespace std;
int n,m;
int p[1000005],u;
long long f[1000005],r[1000005][2],ans=9999999999999;
int ti(int a,int b)
{
return r[b][1]-r[a][1]-r[a][0]*(b-a);
}
int a[4000005];
int main()
{
cin>>n>>m;
for(register int i=1;i<=n;++i)scanf("%d",&a[i]);
sort(a+1,a+n+1);
int k=-m;//k表示“时间往前压多久”
for(register int i=1;i<=n;++i)
{
if(a[i]-k>m)u+=a[i]-k-m;
k=a[i];p[a[i]-u]++;
}
r[0][0]=p[0];
for(register int i=1;i<=a[n]-u+m;++i)
{
r[i][1]=r[i-1][1]+r[i-1][0];
r[i][0]=r[i-1][0]+p[i];
f[i]=99999999999999;
}
for(int i=0;i<m;++i)f[i]=r[i][1];
for(register int i=0;i<=a[n]-u;++i)
{
for(register int j=i+m;j<i+2*m;++j)f[j]=min(f[j],f[i]+ti(i,j));
}
for(register int i=a[n]-u;i<=a[n]-u+m;++i)ans=min(ans,f[i]);
cout<<ans<<endl;
return 0;
}
大体就是如此了,烦请哪位大佬帮忙提点,我卡这道题已经好几个星期了。
谢谢!!!