제출 #1194499

#제출 시각아이디문제언어결과실행 시간메모리
1194499biankLet's Win the Election (JOI22_ho_t3)C++20
67 / 100
1801 ms456 KiB
#include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define fst first #define snd second #define pb push_back #define eb emplace_back #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() typedef long long ll; typedef double ld; typedef vector<ll> vll; typedef vector<int> vi; typedef pair<int,int> ii; const ld INF = 1e18; const int N = 500; template<typename T> void chmin(T &x, T v) { if (x > v) x = v; } pair<ld, int> dp[N]; const ld EPS = 1e-3; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, k; cin >> n >> k; vector<pair<ll, ll>> x(n); forn(i, n){ cin >> x[i].snd >> x[i].fst; if (x[i].fst == -1) x[i].fst = 1e9; } sort(all(x)); ld ans = INF; forn(c, k + 1) { ld lo = -1000 / ld(c + 1) - 3, hi = 1; ld currAns = INF; while (hi - lo >= EPS) { ld mid = (lo + hi) / 2; forn(a, c + 1) dp[a] = {INF, INF}; dp[0] = {0, 0}; forn(i, n) dforn(a, c + 1) { pair<ld, int> curr = dp[a]; curr.fst += ld(x[i].fst) / (a + 1); chmin(dp[a + 1], curr); curr = dp[a]; curr.fst += mid + ld(x[i].snd) / (c + 1); curr.snd--; chmin(dp[a], curr); } dp[c].snd *= -1; dp[c].fst -= mid * (k - c); if (dp[c].snd >= k - c) { lo = mid; currAns = dp[c].fst; } else { hi = mid; } } chmin(ans, currAns); } cout << fixed << setprecision(10) << ans << '\n'; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...