题目不难,就是细节较多。
P.S. 这题我好像调了一年。
一道值得付出时间的题。
上代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int f[10005][1005]={},l[10005]={},h[10005]={},n,m,t,x[10005]={},y[10005]={},g[10005]={},t1,t2,t3;
int main(){
scanf("%d%d%d",&n,&m,&t);
for(int i=0;i<=n;i++)l[i]=0,h[i]=1<<24;
for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
for(int i=0;i<t;i++)scanf("%d%d%d",&t1,&t2,&t3),l[t1]=t2,h[t1]=t3,g[i]=t1;
for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)f[i][j]=1<<30;
for(int i=1;i<=n;i++){
for(int j=x[i]+1;j<=m;j++)f[i][j]=min(f[i-1][j-x[i]],f[i][j-x[i]])+1;
for(int j=m-x[i];j<=m;j++)f[i][m]=min(f[i][m],min(f[i-1][j],f[i][j])+1);
for(int j=1;j<=m-y[i];j++)f[i][j]=min(f[i][j],f[i-1][j+y[i]]);
for(int j=0;j<=l[i];j++)f[i][j]=1<<24;
for(int j=h[i];j<=m;j++)f[i][j]=1<<24;
}
t1=1<<24;t2=0;
for(int i=0;i<=m;i++)t1=min(t1,f[n][i]);
if(t1<1<<22){printf("%d\n%d\n",1,t1);return 0;}
for(int i=n-1;i>=0;i--)for(int j=0;j<=m;j++)if(f[i][j]<1<<22){t2=i;goto N;}
N: sort(g,g+t);
for(int i=0;i<t;i++)if(g[i]>t2){t3=i;break;}
printf("%d\n%d\n",0,t3);
return 0;
}