洛谷P1052 过河
Title
思路
缩短距离
超过90就当90算
设f[i]为到i的值
f[0]=0
f[i+j]=min(f[i+j],f[i]+i是否有石子)
1<=i<=n+t
s<=j<=t
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long a[210],b[210],c[20010],f[20010];
int main()
{
ios::sync_with_stdio(false);
long long n,m,s,t,i,j,ans;
memset(f,0x7f7f7f7f,sizeof(f)),memset(c,0,sizeof(c));
for(cin>>n>>s>>t>>m,i=1; i<=m; i++)cin>>a[i];
if(s==t)
{
for(ans=0,i=1;i<=m;i++)
ans+=(a[i]%s==0);
cout<<ans;
return 0;
}
for(sort(a+1,a+1+m),a[0]=b[0]=0,i=1; i<=m; i++)b[i]=b[i-1]+min(a[i]-a[i-1],(long long)90),c[b[i]]=1;
for(n=b[m]+min((long long)90,n-a[m]),f[0]=0,i=0; i<=n+t; i++)
for(j=s; j<=t; j++)
if(i+j>n)f[n]=min(f[n],f[i]+c[n]);
else f[i+j]=min(f[i+j],f[i]+c[i+j]);
for(ans=0x7f7f7f7f,i=n; i<=n+t; i++)ans=min(ans,f[i]);
cout<<ans;
return 0;
}