luogu p1941 愤怒的小鸟

题意:就是愤怒的小鸟
这是一道标标准准的细节题。。WA了好多次。。。
总有一天刷完背包tag我要做个整理。。
代码:

//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

#define N 10005
using namespace std;
int n, m, k, x[N], y[N], low[N], high[N], f[N][2005];
bool flag[N];

int main() {
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
    for (int i = 1; i <= n; i++) {
        high[i] = m;
        low[i] = 1;
    }

    for(int i=1;i<=k;i++){
        int xx,yy,zz;
        cin>>xx>>yy>>zz;
        flag[xx] = 1;
        low[xx] = yy+1;
        high[xx] = zz-1;
    }
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=m;i++) f[0][i] = 0;

    for(int i =1;i<=n;i++){
        for(int j  = x[i]+1;j<=x[i]+m;j++){
            f[i][j] = min(f[i-1][j-x[i]]+1,f[i][j-x[i]]+1);
        }

        for(int j = m;j<=x[i]+m;j++){
            f[i][m] = min(f[i][m],f[i][j]);
        }

        for(int j = 1;j<=m-y[i];j++){
            f[i][j] = min(f[i][j],f[i-1][j+y[i]]);
        }

        for(int j =1;j<=low[i]-1;j++) f[i][j] = 0x3f3f3f3f;
        for(int j = high[i]+1;j<=m;j++) f[i][j] = 0x3f3f3f3f;
    }

    int ans = 0x3f3f3f3f;
    for(int i =1;i<=m;i++) ans = min(ans,f[n][i]);
    if(ans<0x3f3f3f3f){
        cout<<1<<endl;
        cout<<ans<<endl;
    }else{
        int i,j;
        for(i=n;i>=1;i--){
            for(j = 1;j<=m;j++){
                if(f[i][j]<0x3f3f3f3f){
                    break;
                }
            }
            if(j<=m) break;
        }
        ans = 0 ;
        for(int j=1;j<=i;j++){
            if(flag[j]) ans++;
        }

        cout<<0<<endl;
        cout<<ans<<endl;
    }
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务