p5017 NOIP2018普及组 t4 摆渡车 求助
  • 板块学术版
  • 楼主a1589255859
  • 当前回复25
  • 已保存回复25
  • 发布时间2021/5/2 22:09
  • 上次更新2023/11/4 23:49:38
查看原帖
p5017 NOIP2018普及组 t4 摆渡车 求助
95780
a1589255859楼主2021/5/2 22:09

题目链接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;
}

大体就是如此了,烦请哪位大佬帮忙提点,我卡这道题已经好几个星期了。

谢谢!!!

2021/5/2 22:09
加载中...