NOIP2014飞扬的小鸟

来源:互联网 发布:淘宝联盟在哪里提现 编辑:程序博客网 时间:2024/05/01 11:47

天哪细节问题调了一个钟,手速不够快思路不够清晰写了一个钟,感觉一道第三题就要花掉我2个钟那我比赛的时候肿么办QAQ

说下这道题,首先纯暴力,70分到手,然后我们把01背包的转移变成有上界的完全背包,还有一些特殊情况特殊转移,代码还是比较好看的,去年比赛不知是电脑问题还是什么一直没输出,蠢到家了然后这题爆蛋了QAQQQQQQQQQQQ

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define N 10005#define M 1005#define inf 1000000007#define LL long longusing namespace std;int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}int n,m,k,ans=inf;int up[N],down[N],b[N][3];int f[N][M];int main(){    freopen("bird.in","r",stdin);    freopen("bird.out","w",stdout);    memset(b,0,sizeof(b));    n=read();m=read();k=read();    for (int i=0;i<n;i++)        up[i]=read(),down[i]=read();    for (int i=1;i<=k;i++)    {        int x=read();        b[x][1]=read(),b[x][2]=read();        }    for (int i=1;i<=n;i++)        if (!b[i][2]) b[i][2]=m+1;    for (int i=1;i<N;i++)        for (int j=0;j<M;j++)            f[i][j]=inf;f[0][0]=inf;    for (int i=1;i<=n;i++)    {        for (int j=up[i-1]+1;j<=m;j++)        {            f[i][j]=min(f[i][j],f[i-1][j-up[i-1]]+1);            f[i][j]=min(f[i][j],f[i][j-up[i-1]]+1);            }        for (int j=m-up[i-1];j<=m;j++)        {            f[i][m]=min(f[i][m],f[i-1][j]+1);            f[i][m]=min(f[i][m],f[i][j]+1);            }        for (int j=b[i][1]+1;j<b[i][2];j++)            if (j+down[i-1]<=m)               f[i][j]=min(f[i][j],f[i-1][j+down[i-1]]);        f[0][0]=inf;        for (int j=0;j<=b[i][1];j++) f[i][j]=inf;        for (int j=m;j>=b[i][2];j--) f[i][j]=inf;        }/*    for (int j=n;j>=0;j--)    {        for (int i=1;i<=n;i++)            cout<<f[i][j]<<' ';        cout<<endl;        }*/    for (int i=0;i<=m;i++)        ans=min(ans,f[n][i]);    if (ans!=inf)     {                 printf("1\n%d\n",ans);                 return 0;                 }    else    {        for (int i=n-1;i>=0;i--)        {            for (int j=1;j<=m;j++)                if (f[i][j]<inf)                {                                 ans=i;                                 break;                                 }            if (ans<inf) break;            }        }    int cnt=0;    for (int i=0;i<=ans;i++)        if(b[i][2]!=m+1&&b[i][2]!=0) cnt++;      printf("0\n%d\n",cnt);             //    for (int i=0;i<n;i++)cout<<b[i][1]<<' '<<b[i][2]<<endl;    return 0;}


1 0
原创粉丝点击