45pts玄关
查看原帖
45pts玄关
952663
fjh0531楼主2024/10/12 08:45
#include<bits/stdc++.h>
using namespace std;
#define debug cout<<"debug"<<endl;
int n,m,k;
int x[10001],y[10001];
int dp[10001][1001];
int l[10001],h[10001];

int main()
{
    cin>>n>>m>>k;
    for(int i=0; i<n; i++) cin>>x[i]>>y[i];
    for(int i=1; i<=k; i++)
    {
        int q;
        cin>>q>>l[q]>>h[q];
    }

    int rec=0;
    for(int q=1; q<=n; q++)
    {

        //dp
        for(int p=1; p<=m-1; p++)
        {
            dp[q][p]=INT_MAX;
            int i=1;
            if(p+y[q-1]<=m&&dp[q-1][p+y[q-1]]!=-1) dp[q][p]=dp[q-1][p+y[q-1]];
            while(p-i*x[q-1]>=1)
            {
                if(dp[q-1][p-i*x[q-1]]!=-1) dp[q][p]=min(dp[q][p],dp[q-1][p-i*x[q-1]]+i);
                i++;
            }
            if(dp[q][p]==INT_MAX) dp[q][p]=-1;

        }

        //特判顶部
        dp[q][m]=INT_MAX;
        for(int p=1; p<=m-1; p++)
        {
            int i=(m-p+1)/x[q-1]+1;
            if(dp[q-1][p]!=-1) dp[q][m]=min(dp[q][m],dp[q-1][p]+i);
        }
        if(dp[q][m]==INT_MAX) dp[q][m]=-1;
        //判管道
        if(l[q]!=0||h[q]!=0)
        {
            int check=0;
            for(int i=1; i<=l[q]; i++) dp[q][i]=-1;
            for(int i=m; i>=h[q]; i--) dp[q][i]=-1;
            for(int i=1; i<=m; i++) if(dp[q][i]!=-1&&check!=1) rec++,check=1;
        }
    }

    int ans=INT_MAX;
    for(int i=1; i<=m; i++) if(dp[n][i]!=-1) ans=min(ans,dp[n][i]);
    if(ans==INT_MAX)
    {
        cout<<0<<endl<<rec;
    }
    else cout<<1<<endl<<ans;
    /*
    cout<<endl;

    for(int i=m;i>=1;i--){
        for(int j=0;j<=n;j++) cout<<dp[j][i]<<" ";
        cout<<endl;
    }
    */
    return 0;

}

2024/10/12 08:45
加载中...