Submission #1255036

#TimeUsernameProblemLanguageResultExecution timeMemory
1255036NemanjaSo2005축제 (IOI25_festival)C++20
15 / 100
1096 ms254648 KiB
#include "festival.h" #include<bits/stdc++.h> #define ll long long #define f first #define s second using namespace std; const int maxn=2e5+5; vector<pair<ll,int>> koji[5]; const ll inf=1e18; int n; ll cur,pok[5],dp[75][75][75][75]; int pret[75][75][75][75]; ll perform(ll x,pair<ll,ll> sta){ return max(min(inf,(x-sta.f)*sta.s),-inf/10); } std::vector<int> max_coupons(int A, std::vector<int> P, std::vector<int> T) { n=P.size(); for(int i=1;i<=4;i++) pok[i]=1; for(int i=1;i<=4;i++) koji[i].push_back({0,0}); for(int i=0;i<n;i++) koji[T[i]].push_back({P[i],i}); for(int i=1;i<=4;i++) sort(koji[i].begin(),koji[i].end()); for(int a=0;a<koji[1].size();a++) for(int b=0;b<koji[2].size();b++) for(int c=0;c<koji[3].size();c++) for(int d=0;d<koji[4].size();d++) dp[a][b][c][d]=-inf; dp[0][0][0][0]=A; for(int a=0;a<koji[1].size();a++) for(int b=0;b<koji[2].size();b++) for(int c=0;c<koji[3].size();c++) for(int d=0;d<koji[4].size();d++){ if(a!=0 and dp[a][b][c][d]<perform(dp[a-1][b][c][d],{koji[1][a].first,1})){ dp[a][b][c][d]=perform(dp[a-1][b][c][d],{koji[1][a].first,1}); pret[a][b][c][d]=1; } if(b!=0 and dp[a][b][c][d]<perform(dp[a][b-1][c][d],{koji[2][b].first,2})){ dp[a][b][c][d]=perform(dp[a][b-1][c][d],{koji[2][b].first,2}); pret[a][b][c][d]=2; } if(c!=0 and dp[a][b][c][d]<perform(dp[a][b][c-1][d],{koji[3][c].first,3})){ dp[a][b][c][d]=perform(dp[a][b][c-1][d],{koji[3][c].first,3}); pret[a][b][c][d]=3; } if(d!=0 and dp[a][b][c][d]<perform(dp[a][b][c][d-1],{koji[4][d].first,4})){ dp[a][b][c][d]=perform(dp[a][b][c][d-1],{koji[4][d].first,4}); pret[a][b][c][d]=4; } } /*for(int c=0;c<koji[3].size();c++) for(int d=0;d<koji[4].size();d++){ cout<<c<<" "<<d<<endl; cout<<endl; for(int a=0;a<koji[1].size();a++){ for(int b=0;b<koji[2].size();b++) cout<<dp[a][b][c][d]<<" "; cout<<endl; } cout<<endl; }*/ int ra=0,rb=0,rc=0,rd=0; for(int a=0;a<koji[1].size();a++) for(int b=0;b<koji[2].size();b++) for(int c=0;c<koji[3].size();c++) for(int d=0;d<koji[4].size();d++){ if(dp[a][b][c][d]<0) continue; if(a+b+c+d>ra+rb+rc+rd){ ra=a; rb=b; rc=c; rd=d; } } vector<int> br; while(ra>0 or rb>0 or rc>0 or rd>0){ // cout<<ra<<" "<<rb<<" "<<rc<<" "<<rd<<endl; //cout<<pret[ra][rb][rc][rd]<<endl; br.push_back(pret[ra][rb][rc][rd]); switch (pret[ra][rb][rc][rd]){ case 1: ra--; break; case 2: rb--; break; case 3: rc--; break; default: rd--; } } reverse(br.begin(),br.end()); vector<int> R; for(int x:br){ R.push_back(koji[x][pok[x]].second); pok[x]++; } return R; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...