Submission #1098357

#TimeUsernameProblemLanguageResultExecution timeMemory
1098357simona1230Olympiads (BOI19_olympiads)C++17
0 / 100
162 ms9612 KiB
#include <bits/stdc++.h> using namespace std; int n,k,c; int a[501][32]; vector<int> v[32]; int p[32][2048]; int used[501][2048]; int forb[501][2048]; struct team { int id; team() {} team(int i) { id=i; } bool operator<(const team&t)const { int sum=0; for(int j=1; j<=k; j++) { int curr=v[j][p[j][t.id]]; sum+=a[curr][j]; } int sum2=0; for(int j=1; j<=k; j++) { int curr=v[j][p[j][id]]; sum2+=a[curr][j]; } return sum2<sum; } }; priority_queue<team> q; int h; bool cmp(int i1,int i2) { return a[i1][h]>a[i2][h]; } void read() { cin>>n>>k>>c; for(int i=1; i<=n; i++) { for(int j=1; j<=k; j++) { cin>>a[i][j]; v[j].push_back(i); } } for(int i=1; i<=k; i++) h=i,sort(v[i].begin(),v[i].end(),cmp); for(int j=1; j<=k; j++) v[j].push_back(0); for(int i=1; i<=k; i++) for(int j=n; j>=1; j--) v[i][j]=v[i][j-1]; /*for(int i=1; i<=k; i++) { for(int j=1; j<=n; j++) cout<<v[i][j]<<" "; cout<<endl; }*/ } int comb[501][501]; void prec() { for(int i=0; i<=n; i++) { for(int j=0; j<=i; j++) { if(i==0||j==0)comb[i][j]=1; else comb[i][j]=min(c,comb[i-1][j]+comb[i-1][j-1]); //cout<<i<<" "<<j<<" "<<comb[i][j]<<endl; } } } int num=0; void solve() { num++; for(int i=1; i<=k; i++) p[i][num]=1,used[v[i][1]][num]=1; q.push(num); while(1) { int id=q.top().id; q.pop(); int in=0,lf=0; for(int i=1; i<=n; i++) if(!used[i][id]){lf++;} set<int> s; for(int i=1; i<=k; i++) s.insert(v[i][p[i][id]]); in=s.size(); c-=comb[lf][k-in]; int sum=0; for(int d=1; d<=k; d++) { sum+=a[v[d][p[d][id]]][d]; } if(c<=0) { cout<<sum<<endl; return; } for(auto it=s.begin(); it!=s.end(); it++) { num++; int i=*it; forb[i][num]=1; for(int j=1; j<=n; j++) forb[j][num]=max(forb[j][num],forb[j][id]), used[j][num]=used[j][id]; bool pos=1; for(int d=1; d<=k; d++) { while(p[d][num]<=n&&forb[v[d][p[d][num]]][num])p[d][num]++; if(p[d][num]>n)pos=0; else used[v[d][p[d][num]]][num]=1; } if(pos)q.push(num); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); prec(); solve(); 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...