1 条题解

  • 0
    @ 2024-6-13 21:55:43

    v#include<cstdio> #include<algorithm> using namespace std; const int N=10001,INF=0x7ffff; int n,m,k,x[N],y[N],dow[N],up[N],f[N][2001]; int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;++i)scanf("%d%d",&x[i],&y[i]); for(int i=1;i<=n;++i)dow[i]=0,up[i]=m+1; for(int i=1,p,l,h;i<=k;++i){ scanf("%d%d%d",&p,&l,&h); dow[p]=l,up[p]=h; } for(int i=1;i<=n;++i) for(int j=0;j<=m;++j) f[i][j]=INF; f[0][0]=INF; for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ if(j>=x[i-1]){ f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1); f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1); } if(jm) for(int k=j-x[i-1];k<=m;++k){ f[i][j]=min(f[i][j],f[i-1][k]+1); f[i][j]=min(f[i][j],f[i][k]+1); } } for(int j=dow[i]+1;j<=up[i]-1;++j) if(j+y[i-1]<=m) f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]); for(int j=1;j<=dow[i];++j)f[i][j]=INF; for(int j=up[i];j<=m;++j)f[i][j]=INF; } int cnt=k,ans=INF; for(int i=n;i>=1;--i){ for(int j=dow[i]+1;j<=up[i]-1;++j) if(f[i][j]<INF) ans=min(ans,f[i][j]); if(ans!=INF)break; if(up[i]<=m)cnt--; } if(cntk)printf("1\n%d\n",ans); else printf("0\n%d\n",cnt); return 0; }

    • 1

    信息

    ID
    745
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者