当前位置: 代码迷 >> 综合 >> rnqoj-15-采药--压缩区间
  详细解决方案

rnqoj-15-采药--压缩区间

热度:42   发布时间:2023-12-19 11:10:23.0

当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;
}