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; }