比赛 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;
}