当s==t的时候,比较容易求。
当s<t 的时候,压缩相邻的两个石子之间的距离。任何距离大于150的石子间距都可以缩短到150.
这样dp求解就可以了
还有,一定要注意,石子不一定是有序的,在这里卡了很久,囧~~~
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int l,s,t,m,ans;
int a[151];
int b[151];
int dp[210000];
void dos()
{
int i,j,k;
sort(a+1,a+m+1);
for(i=1;i<=m;i++)
{
b[i]=b[i-1]+min(a[i]-a[i-1],150);
}
for(i=0;i<b[m]+150;i++)dp[i]=150;
dp[0]=0;
for(i=0;i<b[m]+150;i++)
{
for(j=s;j<=t;j++)
{
for(k=1;k<=m;k++)
{
if(i+j==b[k])
{
dp[i+j]=min(dp[i+j],dp[i]+1);
break;
}
}
if(k>m)dp[i+j]=min(dp[i+j],dp[i]);
}
}
ans=151;
for(i=b[m]+1;i<b[m]+150;i++)
{
ans=min(ans,dp[i]);
}
cout<<ans<<endl;
}
int main()
{
int i;
cin>>l;
cin>>s>>t>>m;
for(i=1;i<=m;i++)
{
cin>>a[i];
}
ans=0;
if(s==t)
{
for(i=1;i<=m;i++)
{
if(a[i]%s==0)ans++;
}
cout<<ans<<endl;
}
else
{
dos();
}
return 0;
}