luogu p1941 愤怒的小鸟
题意:就是愤怒的小鸟
这是一道标标准准的细节题。。WA了好多次。。。
总有一天刷完背包tag我要做个整理。。
代码:
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10005
using namespace std;
int n, m, k, x[N], y[N], low[N], high[N], f[N][2005];
bool flag[N];
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
for (int i = 1; i <= n; i++) {
high[i] = m;
low[i] = 1;
}
for(int i=1;i<=k;i++){
int xx,yy,zz;
cin>>xx>>yy>>zz;
flag[xx] = 1;
low[xx] = yy+1;
high[xx] = zz-1;
}
memset(f,0x3f,sizeof(f));
for(int i=1;i<=m;i++) f[0][i] = 0;
for(int i =1;i<=n;i++){
for(int j = x[i]+1;j<=x[i]+m;j++){
f[i][j] = min(f[i-1][j-x[i]]+1,f[i][j-x[i]]+1);
}
for(int j = m;j<=x[i]+m;j++){
f[i][m] = min(f[i][m],f[i][j]);
}
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 =1;j<=low[i]-1;j++) f[i][j] = 0x3f3f3f3f;
for(int j = high[i]+1;j<=m;j++) f[i][j] = 0x3f3f3f3f;
}
int ans = 0x3f3f3f3f;
for(int i =1;i<=m;i++) ans = min(ans,f[n][i]);
if(ans<0x3f3f3f3f){
cout<<1<<endl;
cout<<ans<<endl;
}else{
int i,j;
for(i=n;i>=1;i--){
for(j = 1;j<=m;j++){
if(f[i][j]<0x3f3f3f3f){
break;
}
}
if(j<=m) break;
}
ans = 0 ;
for(int j=1;j<=i;j++){
if(flag[j]) ans++;
}
cout<<0<<endl;
cout<<ans<<endl;
}
return 0;
}


