Submission #949596

#TimeUsernameProblemLanguageResultExecution timeMemory
949596LucaIlieOlympiads (BOI19_olympiads)C++17
13 / 100
2086 ms568 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 500; const int MAX_K = 6; struct team { int total; int score[MAX_K]; void init() { total = 0; for ( int i = 0; i < MAX_K; i++ ) score[i] = 0; } bool operator < ( const team &t ) const { return total < t.total; } team operator + ( const team &t ) const { team ans; ans.total = 0; for ( int i = 0; i < MAX_K; i++ ) { ans.score[i] = max( score[i], t.score[i] ); ans.total += ans.score[i]; } return ans; } }; team students[MAX_N + 1]; int maxScore[MAX_N + 2][1 << MAX_K]; int n, k, m, cnt; void bckt( int c, int s, int p, team crt ) { if ( cnt >= m ) return; if ( c > n - p ) return; if ( c == 0 ) { if ( crt.total >= s ) cnt++; return; } int maxS = 0; for ( int mask = 0; mask < (1 << k); mask++ ) { int score = 0; for ( int j = 0; j < k; j++ ) { if ( (mask >> j) & 1 ) continue; score += crt.score[j]; } maxS = max( maxS, score + maxScore[p + 1][mask] ); } if ( maxS < s ) return; for ( int i = p + 1; i <= n; i++ ) bckt( c - 1, s, i, crt + students[i] ); } int main() { cin >> n >> k >> m; for ( int i = 1; i <= n; i++ ) { for ( int j = 0; j < k; j++ ) { cin >> students[i].score[j]; students[i].total += students[i].score[j]; } } for ( int i = n; i >= 1; i-- ) { for ( int maskPrv = 0; maskPrv < (1 << k); maskPrv++ ) { for ( int mask = 0; mask < (1 << k); mask++ ) { if ( (maskPrv & mask) > 0 ) continue; int s = 0; for ( int j = 0; j < k; j++ ) { if ( (mask >> j) & 1 ) s += students[i].score[j]; } int maskCrt = (maskPrv | mask); maxScore[i][maskCrt] = max( maxScore[i][maskCrt], maxScore[i + 1][maskPrv] + s ); } } } int st = 0, dr = maxScore[1][(1 << k) - 1] + 1; while ( dr - st > 1 ) { int mij = (st + dr) / 2; cnt = 0; team crt; crt.init(); bckt( k, mij, 0, crt ); if ( cnt < m ) dr = mij; else st = mij; } cout << st; 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...