比赛 |
EYOI与SBOI开学欢乐赛2nd |
评测结果 |
AAWWWW |
题目名称 |
免费馅饼 |
最终得分 |
33 |
用户昵称 |
Lesater |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2022-09-02 21:58:41 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int w,h,tmax,tmin=INT_MAX,ans,last;
int dp[1001][100],a[1001][100],b[1001][100];
int main()
{
freopen("freepizza.in","r",stdin);
freopen("freepizza.out","w",stdout);
cin>>w>>h;
int t1,x1,v1,q1;
int nw=w/2+1;
while(cin>>t1)
{
cin>>x1>>v1>>q1;
tmax=max(tmax,t1+h/v1);
if(h%v1==0)
{
tmin=min(tmin,t1+h/v1);
a[t1+h/v1][x1]=q1;
}
else
{
b[t1+h/v1][x1]=q1;
tmin=min(tmin,t1+h/v1+1);
}
}
for(int i=1;i<=tmax;++i)
{
int l=nw-2*i,r=nw+2*i;
if(l<=1) break;
for(int j=1;j<l;++j)
dp[i][j]=-1;
for(int j=w;j>r;--j)
dp[i][j]=-1;
}
for(int i=1;i<=tmax;++i)
{
for(int j=1;j<=w;++j)
{
if(dp[i][j]!=-1)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-2]+a[i][j]);
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]);
dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]);
dp[i][j]=max(dp[i][j],dp[i-1][j+2]+a[i][j]);
dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]+b[i-1][j]);
}
}
}
for(int i=1;i<=w;++i)
if(dp[tmax][i]>ans)
{
ans=dp[tmax][i];
last=i;
}
stack<int> way;
int t=tmax;
while(t>=tmin)
{
t--;
if(t==tmin-1)
{
if(nw>last)
{
int time=(nw-last)/2;
if((nw-last)%2!=0) way.push(-1);
for(int i=1;i<=time;++i)
way.push(-2);
}
else if(nw<last)
{
int time=(last-nw)/2;
for(int i=1;i<=time;++i)
way.push(2);
if((last-nw)%2!=0) way.push(1);
}
}
for(int i=-2;i<=2;++i)
{
if(last+i<1||last+i>w) continue;
if(i==0&&(dp[t][last]+b[t+1][last]==dp[t+1][last]))
break;
if(i!=0&&dp[t][last+i]+a[t+1][last]==dp[t+1][last])
{
last=last+i;
way.push(-i);
break;
}
}
}
cout<<ans<<endl;
while(!way.empty())
{
cout<<way.top()<<endl;
way.pop();
}
return 0;
}