Submission #1201396

#TimeUsernameProblemLanguageResultExecution timeMemory
1201396vincentbucourt1Let's Win the Election (JOI22_ho_t3)C++20
5 / 100
1285 ms16220 KiB
#include <bits/stdc++.h> using namespace std; void fastIO(){ios_base::sync_with_stdio(false),cin.tie(0);} #define int long long #define ld long double const int MAXN = 502; int N, K; struct State{ld vote, colab;}; bool cmpStates (const State& a, const State& b) { if (a.colab == -1) return false; else if (b.colab == -1) return true; else return a.colab < b.colab; } vector<State> states; struct Situ{ ld sumVote, sumColab; bool operator> (const Situ& other) const { if (sumVote+sumColab > other.sumVote+other.sumColab) return true; else if (sumVote+sumColab < other.sumVote+other.sumColab) return false; else return sumColab > other.sumColab; } }; Situ dp[2][MAXN][MAXN]; ld ans = (ld)1e18; signed main() { fastIO(); cin >> N >> K; states.assign(N, State{(ld)0,(ld)0}); for (int i = 0; i < N; i++) { cin >> states[i].vote >> states[i].colab; } sort(states.begin(), states.end(), cmpStates); // for (int i = 0; i < N; i++) cerr << states[i].vote << " " << states[i].colab << "\n"; for (int numVote = 0; numVote <= K; numVote++) { for (int numColab = 0; numColab <= K; numColab++) { dp[0][numVote][numColab] = Situ{(ld)1e18, (ld)1e18}; dp[1][numVote][numColab] = Situ{(ld)1e18, (ld)1e18}; } } dp[0][0][0] = Situ{0, 0}; for (int idx = 0; idx < N; idx++) { for (int numVote = 0; numVote <= K; numVote++) { for (int numColab = 0; numColab <= K; numColab++) { Situ situOn = dp[idx%2][numVote][numColab]; if (dp[(idx+1)%2][numVote][numColab] > Situ{situOn.sumVote, situOn.sumColab}) { dp[(idx+1)%2][numVote][numColab] = situOn; } if (numVote+1 <= K && dp[(idx+1)%2][numVote+1][numColab] > Situ{situOn.sumVote + states[idx].vote, situOn.sumColab}) { dp[(idx+1)%2][numVote+1][numColab] = situOn; dp[(idx+1)%2][numVote+1][numColab].sumVote += states[idx].vote; } if (numVote+1 <= K && numColab+1 <= K && states[idx].colab != -1 && dp[(idx+1)%2][numVote+1][numColab+1] > Situ{situOn.sumVote, situOn.sumColab + states[idx].colab/(numColab+1)}) { dp[(idx+1)%2][numVote+1][numColab+1] = situOn; dp[(idx+1)%2][numVote+1][numColab+1].sumColab += states[idx].colab/(numColab+1); } } } } for (int numColab = 0; numColab <= K; numColab++) { ans = min(ans, dp[N%2][K][numColab].sumColab + dp[N%2][K][numColab].sumVote/(numColab+1)); } cout << fixed << setprecision(12) << ans << "\n"; }
#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...