社区讨论
背包问题求助,55pts
P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lxh3o0ye
- 此快照首次捕获于
- 2024/06/16 13:22 2 年前
- 此快照最后确认于
- 2024/06/16 16:19 2 年前
问题应该出在管道上
CPP#include <bits/stdc++.h>
#define re register
const int INF=0x3f3f3f3f;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
int n,m,k;
int x[10009],y[10009];
int g[1009],f[1009];
int l[10009],h[10009];
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){//0;i<n
scanf("%d%d",&x[i],&y[i]);
}
for(int i=1;i<=k;i++){
int p;scanf("%d",&p);
scanf("%d%d",&l[p],&h[p]);
}
memset(f,0x3f,sizeof f);
int cnt=0;
for(int i=1;i<=n;i++){
if(!h[i]){
for(int j=x[i]+1;j<=m;j++){//i-1
f[j]=min(f[j-x[i]]+1,g[j-x[i]]+1);
}//完全背包
for(int j=m-x[i]+1;j<=m;j++){
f[m]=min(f[m],g[j]+1);
}
for(int j=m-y[i];j;j--){
f[j]=min(f[j],g[j+y[i]]);
}
}else{
for(int j=x[i]+1;j<=h[i]-1;j++){
f[j]=min(f[j-x[i]]+1,g[j-x[i]]+1);
}//
for(int j=l[i]+1;j<=min(h[i]-1,m-y[i]);j++){
f[j]=min(f[j],g[j+y[i]]);
}
int ans=INF;
for(int j=l[i]+1;j<=h[i]-1;j++)
if(f[j]<ans){
ans=f[j];cnt++;
break;
}
if(ans==INF){
printf("0\n%d",cnt);return 0;
}
}
memcpy(g,f,sizeof g);memset(f,0x3f,sizeof f);
}
int res=INF;
for(int i=1;i<=m;i++){
if(g[i]<res)res=g[i];
}
printf("1\n%d",res);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...