记录编号 575258 评测结果 AAAAAA
题目名称 [NOI 1998]免费馅饼 最终得分 100
用户昵称 Gravatar00000 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-09-08 17:07:27 内存使用 0.00 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int wi,h;
int t[3000],p[3000],v[3000],s[3000];
int n=1;
int f[3000][3000],r[3000][3000];//f时间,位置  r路径 
int l;//记录最后时间 
int k[20]={0,-2,-1,0,1,2};
void dp(int x,int y)//f(x,y)
{
	int ans=-1,rr=-2;
	for(int q=1;q<=5;q++)
	{
		if(y+k[q]>=1&&f[x+1][y+k[q]]>ans&&y+k[q]<=wi)
		{
			rr=k[q];
			ans=f[x+1][y+k[q]];
		}
	}
	f[x][y]+=ans;
	r[x][y]=rr;
} 
int main(){
	freopen("freepizza.in","r",stdin);
	freopen("freepizza.out","w",stdout);
cin>>wi>>h;
while(cin>>t[n]>>p[n]>>v[n]>>s[n]) n++;
n--;
for(int q=1;q<=n;q++)
{
	if((h-1)%v[q]==0) 
	{
		l=max(l,t[q]+(h-1)/v[q]);
		f[t[q]+(h-1)/v[q]][p[q]]+=s[q];
	}
}
for(int q=l;q>=0;q--)
	for(int w=1;w<=wi;w++)
		dp(q,w);
int now=(wi+1)/2;
cout<<f[0][now]<<endl;
if(n==0) return 0;
int d=0;
for(int q=0;q<=l;q++)
{
	if(f[q+1][now+r[q][now]]!=f[q][now]) d=q;
	now+=r[q][now];
}
d--;now=(wi+1)/2;
d=max(d,0);
for(int q=0;q<=d;q++)
{
	cout<<r[q][now]<<endl;
	now+=r[q][now];
}
return 0;
}