Submission #1341411

#TimeUsernameProblemLanguageResultExecution timeMemory
1341411alexddSki 2 (JOI24_ski2)C++20
42 / 100
7 ms1780 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
const int MAXN = 45;
int n,k,cate;
pair<int,int> v[305];
int dp[2][MAXN][MAXN][MAXN];
int invc[305];

map<int,int> nrm;
map<int, vector<int>> ofh;

void chmin(int&x, int y)
{
    x = min(x, y);
}

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>k;
    int maxh = 0;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i].first>>v[i].second;
        maxh = max(maxh, v[i].first);
        nrm[v[i].second]++;
        ofh[v[i].first].push_back(i);
    }
    //assert(maxh <= 300);
    maxh += n;//-----------------------------------------------------------------------------------------------------------

    for(auto&it:nrm)
    {
        it.second = ++cate;
        invc[cate] = it.first;
    }
    cate++;
    invc[cate] = INF;

    for(int minc=0;minc<=cate;minc++)
        for(int cnt=0;cnt<=n;cnt++)
            for(int free=0;free<=n+1;free++)
                dp[1][minc][cnt][free] = INF;

    dp[1][cate][0][1] = 0;
    for(int h=0;h<=maxh;h++)
    {
        int pas = h%2;

        for(int minc=0;minc<=cate;minc++)
            for(int cnt=0;cnt<=n;cnt++)
                for(int free=0;free<=n+1;free++)
                    dp[pas][minc][cnt][free] = INF;

        int cur = ofh[h].size(), mincur = cate;
        for(int id:ofh[h])
            mincur = min(mincur, nrm[v[id].second]);

        /*for(int minc=1;minc<=mincur;minc++)
        {
            for(int cnt=0;cnt<=n;cnt++)
            {
                for(int free=0;free<=n+1;free++)
                {

                }
            }
        }*/
        //calc special for mincur-------------------------------------------------------------------

        for(int minc=1;minc<=cate;minc++)
        {
            for(int cnt=0;cnt<=n;cnt++)
            {
                for(int free=0;free<=n+1;free++)
                {
                    if(dp[1-pas][minc][cnt][free] == INF)
                        continue;
                    //for(int putdown=0;putdown<=cnt;putdown++)
                    {
                        //for(int pickup=0;pickup<=cur;pickup++)
                        for(int dif = - cnt - cur; dif <= cur; dif++)
                        {
                            //if(pickup == cur && cur > 0)
                              //  continue;

                            //dif == pickup - putdown

                            int newmin = min(minc, mincur);

                            int newfree = free, newpaying = cur - dif;
                            int mnm = min(newfree, newpaying);
                            newfree -= mnm;
                            newpaying -= mnm;
                            if(newpaying == 0 || minc < cate) chmin(dp[pas][newmin][cnt + dif][newfree + cur - dif], dp[1-pas][minc][cnt][free] + newpaying * invc[minc] + (cnt + dif) * k);
                        }
                    }
                }
            }
        }
    }
    int rez = INF;
    for(int minc=1;minc<=cate;minc++)
        for(int free=0;free<=n+1;free++)
            rez = min(rez, dp[maxh%2][minc][0][free]);
    assert(rez != INF);
    cout<<rez;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...