NOIP2014 飞扬的小鸟

来源:互联网 发布:游奇网络 编辑:程序博客网 时间:2024/05/01 08:57

题目:http://www.luogu.org/problem/show?pid=1941
分析:一个背包问题。[i,j]是跳上来的情况时:可以由[i,j-k]得到,则问题得到解决。注意:f数组要先进行上升操作,再进行下降操作,否则[i,j-k]有可能是下降得到的,从而得到错解(吸取我的教训吧,调了好长时间)
代码:

#include <cstdio>#include <algorithm>using namespace std;const int Tmaxn= 10005,Tmaxm=1005,inf=0x7ffffff;int n,m,k,f[Tmaxn][Tmaxm],up[Tmaxn],down[Tmaxn],data[Tmaxn][2];void work(){    int i,j,k,ans=0;    bool ok;    for(i=1;i<=n;i++)    {        ok=false;        for(j=1;j<=m;j++)        {            if(j==m)            {                for(k=m-up[i-1];k<=m;k++)                {                    f[i][j]=min(f[i][j],f[i-1][k]+1);                    f[i][j]=min(f[i][j],f[i][k]+1);                }            }            if(j>up[i-1])  //=            {                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);            }            if(f[i][j]!=inf&&j>data[i][0]&&j<data[i][1]) ok=true;        }        for(j=data[i][0]+1;j<data[i][1];j++)        {            if(j+down[i-1]<=m)                f[i][j]=min(f[i][j],f[i-1][j+down[i-1]]);            if(f[i][j]!=inf) ok=true;        }        if(ok)          if(data[i][1]!=m+1) ans++;          else;        else{            printf("0\n%d\n",ans);            return;        }        for(j=0;j<=data[i][0];j++) f[i][j]=inf;        for(j=m;j>=data[i][1];j--) f[i][j]=inf;    }    ans=inf;    for(i=0;i<=m;i++)        ans=min(ans,f[n][i]);    printf("1\n%d\n",ans);    return;}void init(){    int i,j;    for(i=1;i<=n+1;i++)        for(j=0;j<=m+1;j++)            f[i][j]=inf;    return;}int main(){    int i,p;    scanf("%d%d%d",&n,&m,&k);    for(i=0;i<n;i++)    {        scanf("%d%d",&up[i],&down[i]);        data[i][0]=0;        data[i][1]=m+1;    }    data[n][0]=0;    data[n][1]=m+1;    for(i=1;i<=k;i++)    {        scanf("%d",&p);        scanf("%d%d",&data[p][0],&data[p][1]);    }    init();    work();    /*    for(i=m;i>=0;i--)    {        for(p=0;p<=n;p++)          printf("%10d ",f[p][i]);        printf("\n");    }    */    return 0;}
0 0
原创粉丝点击