洛谷P1052 过河

洛谷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;
}

Guess you like

Origin blog.csdn.net/weixin_46975572/article/details/116399219