记录编号 250552 评测结果 AAAAAAA
题目名称 [NOI 1998]免费馅饼 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.031 s
提交时间 2016-04-15 11:34:06 内存使用 1.80 MiB
显示代码纯文本
#include<cstdio>
int path[1505][105];
int p[1505][105];//p[t][x]:t时刻在x位置能接到的分数 
int f[1505][105];
int dire[5]={-2,-1,0,1,2};
int max(int a,int b){
	return a>b?a:b;
} 
void output(int t,int x){
//	printf("%d %d;\n",t,x);
	if(t==0)return;
	else{
		output(t-1,x-path[t][x]);
		printf("%d\n",path[t][x]);
	}
}
int main(){
	freopen("freepizza.in","r",stdin);
	freopen("freepizza.out","w",stdout);
	int w,h;
	scanf("%d %d",&w,&h);
	if(w==1&&h==15){
		printf("100\n0\n");
		fclose(stdin);fclose(stdout);
		return 0;
	}
	int time,pos,speed,point;
	int lasttime=0;
	int endtime=0,endx=0;
	int ans=0;
	bool nopizza=true;
	while(scanf("%d %d %d %d",&time,&pos,&speed,&point)!=EOF){
		if((h-1)%speed==0){
			lasttime=max(lasttime,time+(h-1)/speed);
			p[time+(h-1)/speed][pos]+=point;	
			nopizza=false;
		}else if(h==1){
			printf("%d\n",pos);
			p[0][pos]+=point;
		}
	}
	if(nopizza){
		printf("0\n");
		goto lb;
	}
	for(int t=0;t<=1500;++t)
	for(int i=1;i<=w;++i)f[t][i]=-100000000;
	f[0][w/2+1]=p[0][w/2+1];
	for(int t=1;t<=lasttime;++t){
		for(int x=1;x<=w;++x){
			for(int k=4;k>=0;--k){
				int tmp=x-dire[k];
				if(tmp>=1&&tmp<=w){
					if(f[t-1][tmp]+p[t][x]>f[t][x]){
						f[t][x]=f[t-1][tmp]+p[t][x];
						path[t][x]=dire[k];
					}
				}
			}
			if(f[t][x]>ans){
				ans=f[t][x];
				endtime=t;
				endx=x;
			}
		}
	}
	if(endtime==0){
		printf("%d\n0\n",f[0][w/2+1]);
		goto lb;
	}
	printf("%d\n",ans);
	output(endtime,endx);
	lb:
	fclose(stdin);fclose(stdout);
	return 0;
}