제출 #1334294

#제출 시각아이디문제언어결과실행 시간메모리
1334294WongYiKaiIMO (EGOI25_imo)C++20
100 / 100
541 ms25232 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

bool srt(pair<pair<ll,ll>,vector<ll>> a, pair<pair<ll,ll>,vector<ll>> b){
    if (a.first.first < b.first.first) return true;
    if (a.first.first > b.first.first) return false;
    return a.first.second > b.first.second;
}

int main(){
    ll n,m,k;
    cin >> n >> m >> k;
    vector<pair<pair<ll,ll>,vector<ll>>> guy;
    for (int i=0;i<n;i++){
        vector<ll> score;
        ll sum = 0;
        for (int j=0;j<m;j++){
            ll a;
            cin >> a;
            score.push_back(a);
            sum += a;
        }
        sort(score.begin(),score.end());
        guy.push_back({{sum,i},score});
    }
    sort(guy.begin(),guy.end(),srt);
    ll dp[m*k+5],dp3[m*k+5];
    ll dp2[m+1][m*k+5];
    for (int i=0;i<n;i++){
        ll lb = 0;
        if (i != 0) lb = guy[i-1].first.first;
        ll li = n*m*2;
        if (i != 0) li = guy[i-1].first.second;
        for (int k1=lb;k1<=guy[i].first.first;k1++){
            dp2[0][k1] = 0;
        }
        dp2[0][guy[i].first.first] = 1;
        for (int j=0;j<m;j++){
            for (int k1=lb;k1<=guy[i].first.first;k1++){
                dp2[j+1][k1] = 0;
            }
            for (int j1=j;j1>=0;j1--){
                for (int k1=lb;k1<=guy[i].first.first;k1++){
                    if (dp2[j1][k1]==0) continue;
                    dp2[j1+1][k1-guy[i].second[j]] = 1;
                }
            }
        }
        ll mx = m*k;
        if (i != n-1){
            mx = guy[i+1].first.first;
        }
        for (int k1=lb;k1<=mx;k1++) dp3[k1] = n*m*k*2;
        for (int k1=lb;k1<=guy[i].first.first;k1++){
            for (int j=0;j<=m;j++){
                if (dp2[j][k1]==0) continue;
                if (k1==lb && guy[i].first.second > li) continue;
                if (k1 < lb || j*k+k1 > mx) continue;
                if (i==0){
                    dp3[j*k+k1] = min(dp3[j*k+k1],m-j);
                    continue;
                }
                if (guy[i].first.second > li){
                    dp3[j*k+k1] = min(dp3[j*k+k1],dp[k1-1]+(m-j));
                }
                else dp3[j*k+k1] = min(dp3[j*k+k1],dp[k1]+(m-j));
            }
        }
        ll mn = dp3[guy[i].first.first];
        for (ll k1=guy[i].first.first;k1<=mx;k1++){
            mn = min(mn,dp3[k1]);
            dp[k1] = mn;
            //cout << i << ' ' << k1 << ' ' << mn << "\n";
        }
    }
    cout << dp[m*k];
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...