P1941 [NOIP 2014 提高组] 飞扬的小鸟

点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int N=10010,M=1010,INF=0x3f3f3f3f;
int n,m,k;
int u[N],d[N];
int l[N],h[N];
int f[N][M];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m>>k;

    for(int i=0;i<=n-1;i++){
        cin>>u[i]>>d[i];
    }

    for(int i=1;i<=n;i++) l[i]=0,h[i]=m+1;

    for(int i=0;i<k;i++){
        int p;
        cin>>p;
        cin>>l[p]>>h[p];
    }

    memset(f,0x3f,sizeof f);
    for(int j=0;j<=m;j++) f[0][j]=0;

    int pipes=0;
    for(int i=1;i<=n;i++){

        int x=u[i-1],y=d[i-1];

        //处理上升的情况
        for(int j=1;j<=m;j++){
            if(j>x) f[i][j]=min(f[i][j],min(f[i-1][j-x]+1,f[i][j-x]+1));
        }
        //判断超过边界的情况
        for(int j=max(1,m-x+1);j<=m;j++){
            f[i][m]=min(f[i][m],min(f[i-1][j]+1,f[i][j]+1));
        }
        //处理下降的情况
        for(int j=1;j<=m-y;j++){
            f[i][j]=min(f[i][j],f[i-1][j+y]);
        }

        bool safe=false;

        for(int j=1;j<=m;j++){
            if(j<=l[i]||j>=h[i]) f[i][j]=INF;
            if(f[i][j]<INF) safe=true;
        }

        if(!safe){
            cout<<'0'<<endl<<pipes<<endl;
            return 0;
        }

        
        if(l[i]>0||h[i]<m+1) pipes++;
    }
    int ans=INF;
    for(int j=1;j<=m;j++) ans=min(ans,f[n][j]);
    cout<<'1'<<endl<<ans<<endl;

    return 0;
}

posted @ 2026-02-04 22:16  AnoSky  阅读(0)  评论(0)    收藏  举报