1 条题解
-
0117爱好者 (mengqingyu) LV 10 @ 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
- 上传者