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

来源:互联网 发布:数码大师2016软件下载 编辑:程序博客网 时间:2024/06/05 03:14

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


原创粉丝点击