Submission #1224207

#TimeUsernameProblemLanguageResultExecution timeMemory
122420712345678Olympiads (BOI19_olympiads)C++20
13 / 100
2092 ms1684 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=505;

int n, k, c, used[nx], dp[nx][nx], tmp;

struct students
{
    int s, idx, a[6];
    bool operator< (const students &o) const {return s<o.s;}
} s[nx];
students sub[6][nx];
vector<students> req;
multiset<int> ms;

void bruteforce(int idx, vector<int> cur, int cnt)
{
    //cout<<"dbg "<<idx<<'\n';
    if (idx==n)
    {
        if (cnt==k)
        {
            tmp++;
            int sm=0;
            for (auto x:cur) sm+=x;
            ms.insert(sm);
            if (ms.size()>c) ms.erase(ms.begin());
        }
        return;
    }
    if (cnt<k) 
    {
        vector<int> tmp(k);
        for (int i=0; i<k; i++) tmp[i]=max(cur[i], req[idx].a[i]);
        bruteforce(idx+1, tmp, cnt+1);
    }
    bruteforce(idx+1, cur, cnt);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>k>>c;
    dp[0][0]=1;
    for (int i=1; i<=n+1; i++) for (int j=0; j<=i; j++) dp[i][j]=dp[i-1][j]+(j?dp[i-1][j-1]:0); //cout<<"dp "<<i<<' '<<j<<' '<<dp[i][j]<<'\n';
    for (int i=0; i<n; i++) for (int j=0; j<k; j++) cin>>s[i].a[j];
    for (int i=0; i<k; i++) for (int j=0; j<n; j++) sub[i][j]=s[j], sub[i][j].s=s[j].a[i], sub[i][j].idx=j;
    for (int i=0; i<k; i++) sort(sub[i], sub[i]+n), reverse(sub[i], sub[i]+n);
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<k; j++)
        {
            if (!used[sub[j][i].idx]&&dp[req.size()+1][k]<3000000)
            {
                used[sub[j][i].idx]=1;
                req.push_back(sub[j][i]);
            }
        }
    }
    //cout<<"debug "<<req.size()<<'\n';
    bruteforce(0, vector<int>(k), 0);
    //cout<<"end "<<tmp<<' '<<dp[req.size()][k]<<'\n';
    if (tmp!=dp[req.size()][k]) cout<<1/0;
    auto itr=prev(ms.end());
    while (--c) --itr;
    cout<<*itr;
}

/*
5 3 4
7 0 4
3 0 8
1 1 3
5 1 3
4 2 2

*/

Compilation message (stderr)

olympiads.cpp: In function 'int main()':
olympiads.cpp:65:40: warning: division by zero [-Wdiv-by-zero]
   65 |     if (tmp!=dp[req.size()][k]) cout<<1/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...