36pts,re#5~#11,有提交记录,悬赏1关注
查看原帖
36pts,re#5~#11,有提交记录,悬赏1关注
169594
Heart_Of_Iron_4楼主2023/6/5 18:55

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long 
int l,s,t,m,n,t1,t2,t3,gbs,minn=INT_MAX;
bool b[9100000]/*是否有石子*/,c[9100000]/*是否到达过*/;
int a[9100000],d[9100000];
signed main()
{
	scanf("%lld",&l);
	scanf("%lld%lld%lld",&s,&t,&m);
	gbs=s*t/__gcd(s,t);
	for(int i=1;i<=m;++i)scanf("%lld",&d[i]);
	sort(d+1,d+1+m);
	for(int i=1;i<=m;++i)
	{
		t2=d[i];
		t3=t2;
		if(t1-t2>gbs)t2=t1+gbs;
		b[t2]=1;
		t1=t2;
	}//让两个石子中间的距离最大为最小公倍数
	l=t2+(l-t3);//更新压缩后的实际桥长
	for(int i=s;i<=l;++i)
	{
		if(a[i]==0)a[i]=b[i];
		for(int j=s;j<=t;++j)
		{
			if(!c[i+j])
			{
				a[i+j]=a[i]+b[i+j];
				c[i+j]=1;
			}
			else a[i+j]=min(a[i+j],a[i]+b[i+j]);
		}
	}
	for(int i=l;i<=l+t;++i)
	{
		if(c[i])minn=min(a[i],minn);
	}
	//for(int i=1;i<=l+t;++i)printf("%lld ",a[i]);
	printf("%lld",minn);
	return 0;
}
2023/6/5 18:55
加载中...