记录编号 |
140601 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2014]飞扬的小鸟 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.052 s |
提交时间 |
2014-11-22 20:12:53 |
内存使用 |
48.62 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
int f[10010][1010],n,m,k,s[10010]={0},x[10010],y[10010],p,l,h;
bool flag[10010][1010]={0};
int Min(int x,int y){if(x>y)return y; return x;}
int main(){
freopen("birda.in","r",stdin);
freopen("birda.out","w",stdout);
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<=k;i++){
scanf("%d%d%d",&p,&l,&h);
s[p]=1;
for(int j=1;j<=l;j++) flag[p][j]=true;
for(int j=h;j<=m;j++) flag[p][j]=true;
}
for(int i=1;i<=n;i++) s[i]+=s[i-1];
memset(f,0x3f,sizeof(f));
int Not=f[0][0];
for(int i=1;i<=m;i++) if(!flag[0][i]) f[0][i]=0;
for(int i=1;i<=n;i++){
for(int j=x[i-1]+1;j<=m;j++){
if(f[i-1][j-x[i-1]]<Not) f[i][j]=Min(f[i][j],f[i-1][j-x[i-1]]+1);
if(f[i][j-x[i-1]]<Not) f[i][j]=Min(f[i][j],f[i][j-x[i-1]]+1);
}
for(int j=1;j<=m;j++) if(flag[i][j]) f[i][j]=Not;
for(int j=1;j<=m;j++){
if(flag[i][j]) continue;
if(j+y[i-1]<=m && f[i-1][j+y[i-1]]<Not) f[i][j]=Min(f[i][j],f[i-1][j+y[i-1]]);
}
if(!flag[i][m])
for(int j=m-x[i-1];j<=m;j++){
if(flag[i][j]) continue;
if(f[i-1][j]<Not) f[i][m]=Min(f[i][m],f[i-1][j]+1);
if(f[i][j]<Not) f[i][m]=Min(f[i][m],f[i][j]+1);
}
}
int ans=0x7fffffff;
bool ok=false;
for(int j=1;j<=m;j++) if(f[n][j]<Not&&ans>f[n][j]){ok=true;ans=f[n][j];}
if(ok) printf("1\n%d\n",ans);
else{
printf("0\n");
for(int i=n-1;i>=1;i--)
for(int j=1;j<=m;j++)
if(f[i][j]<Not){printf("%d",s[i]);return 0;}
}
}