50分求助
查看原帖
50分求助
1032705
16squareZ楼主2024/7/16 22:33
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define MAXN 10001
#define MAXM 1001
#define MAXK 10001
#define NONE 2139062143
using namespace std;
struct _TUBE{
    int p,l,h;
}tube[MAXK];
bool cmp(_TUBE t1,_TUBE t2){return t1.p<t2.p;}
int n,m,k,x[MAXN],y[MAXN],tp,Ul,Dl,flag,ansflag,ans,dp[MAXN][MAXM];
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<n;i++) cin>>x[i]>>y[i];
    for(int i=0;i<k;i++) cin>>tube[i].p>>tube[i].l>>tube[i].h;
    sort(tube,tube+k,cmp);
    memset(dp,0x7F,sizeof(dp));
    for(int j=1;j<=m;j++) dp[0][j]=0;
    ansflag=1;
    for(int i=1;i<=n;i++)
    {
        Ul=m;Dl=1;
        flag=1;
        if(i==tube[tp].p)
        {
            Ul=min(Ul,tube[tp].h-1);
            Dl=max(Dl,tube[tp].l+1);
            tp++;
        }
        for(int j=Dl;j<=Ul;j++)
        {
            if(j==m)
            {
                for(int xt=0;xt<x[i-1];xt++)
                    if(dp[i-1][j-xt]!=NONE)
                        dp[i][j]=min(dp[i][j],dp[i-1][j-xt]+1);
            }
            for(int t=1;j-x[i-1]*t>0;t++)
                if(dp[i-1][j-x[i-1]*t]!=NONE)
                    dp[i][j]=min(dp[i][j],dp[i-1][j-x[i-1]*t]+t);
            if(j+y[i-1]<=m)
                if(dp[i-1][j+y[i-1]]!=NONE)
                    dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1]]);
            if(dp[i][j]!=NONE)
                flag=0;
        }
        if(flag)
        {
            ansflag=0;
            ans=tp-1;
            break;
        }
    }
    if(ansflag)
    { 
        ans=NONE;
        for(int j=1;j<=m;j++)
            if(dp[n][j]!=NONE)
              if(dp[n][j]<ans) 
                  ans=dp[n][j];
    }
    cout<<ansflag<<endl;
    cout<<ans<<endl;
    return 0;
}

2024/7/16 22:33
加载中...