55分求助
查看原帖
55分求助
605687
Vannessa楼主2021/12/1 13:24
#include <bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f,N=10005;
bool f[N];
int n,m,k;
int dp[N][2005];

struct Node {
    int x,y;
} a[N];

struct guan {
    int l,h;
} b[N];

int main() {
    cin>>n>>m>>k;
    memset(dp,INF,sizeof(dp));
    for(int i=1; i<=m; i++) dp[0][i]=0;
    for(int i=1; i<=n; i++) {
        cin>>a[i].x>>a[i].y;
        b[i].l=1;
        b[i].h=m;
    }
    for(int i=1; i<=k; i++) {
        int p,ll,hh;
        cin>>p>>ll>>hh;
        f[p]=1;
        b[p].l=ll;
        b[p].h=hh;
    }

    for(int i=1; i<=n; i++) {
        for(int j=a[i].x+1; j<=m+a[i].x; j++) {
            dp[i][j]=min(dp[i-1][j-a[i].x]+1,dp[i][j-a[i].x]+1);
        }
        for(int j=m+1; j<=m+a[i].x; j++) {
            dp[i][m]=min(dp[i][m],dp[i][j]);
        }
        for(int j=1; j<=m-a[i].y; j++) {
            dp[i][j]=min(dp[i][j],dp[i-1][j+a[i].y]);
        }
        for(int j=1; j<=b[i].l; j++) dp[i][j]=INF;
        for(int j=b[i].h+1; j<=m; j++) dp[i][j]=INF;
    }

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

    return 0;
}
2021/12/1 13:24
加载中...