记录编号 140601 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2014]飞扬的小鸟 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 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;}
	}
}