Submission #593746

#TimeUsernameProblemLanguageResultExecution timeMemory
593746vovikLet's Win the Election (JOI22_ho_t3)C++17
100 / 100
1072 ms4264 KiB
#include <bits/stdc++.h> namespace IO { const int DPAIRSIZ = 1 << 10; char BB[DPAIRSIZ], *SS = BB, *TT = BB; inline char getcha() { return SS == TT && (TT = (SS = BB) + fread(BB, 1, DPAIRSIZ, stdin), SS == TT) ? EOF : *SS++; } template<typename T = int> inline T read() { T x = 0; int fu = 1; char c = getcha(); while (c > 57 || c < 48) { if (c == 45) fu = -1; c = getcha(); } while (c <= 57 && c >= 48) { x = x * 10 + c - 48; c = getcha(); } x *= fu; return x; } template<typename T> inline void read(T &x) { x = 0; int fu = 1; char c = getcha(); while (c > 57 || c < 48) { if (c == 45) fu = -1; c = getcha(); } while (c <= 57 && c >= 48) { x = x * 10 + c - 48; c = getcha(); } x *= fu; } template<typename T> inline void read(T *bg, T *ed) { while (bg != ed) read(*bg++); } inline void read(char &ch) { ch = getcha(); while (ch <= 32) ch = getcha(); } inline void read(char *s) { char ch = getcha(); while (ch <= 32) ch = getcha(); while (ch > 32) *s++ = ch, ch = getcha(); *s = '\0'; } inline void read(std::string &s) { char ch = getcha(); while (ch <= 32) ch = getcha(); while (ch > 32) s.push_back(ch), ch = getcha(); } inline void sread(char *s) { char ch = getcha(); while (ch < 32) ch = getcha(); while (ch >= 32) *s++ = ch, ch = getcha(); *s = '\0'; } inline void pread(char *&s) { char ch = getcha(); while (ch <= 32) ch = getcha(); while (ch > 32) *s++ = ch, ch = getcha(); *s = '\0'; } inline void spread(char *&s) { char ch = getcha(); while (ch < 32) ch = getcha(); while (ch >= 32) *s++ = ch, ch = getcha(); *s = '\0'; } template<typename T, typename ...Args> inline void read(T &x, Args &...args) { read(x); read(args...); } char out[DPAIRSIZ], *Out = out; #define flush() fwrite(out, 1, Out - out, stdout) inline void putcha(char x) { *Out++ = x; if (Out - out >= (DPAIRSIZ)) flush(), Out = out; } template<typename T> inline void fprint(T x) { if (x < 0) putcha(45), x = -x; if (x > 9) fprint(x / 10); putcha(x % 10 + 48); } inline void print() { putcha(10); } template<typename T> inline void print(T x) { fprint(x); putcha(10); } inline void print(char *ch) { while (*ch != '\0') putcha(*(ch++)); putcha(10); } inline void put(char *ch) { while (*ch != '\0') putcha(*(ch++)); } inline void print(const char *ch) { while (*ch != '\0') putcha(*(ch++)); putcha(10); } inline void put(const char *ch) { while (*ch != '\0') putcha(*(ch++)); } template<typename T, typename ...Args> inline void print(T x, Args ...args) { fprint(x); putcha(32); print(args...); } template<typename ...Args> inline void print(const char *ch, Args ...args) { while (*ch != '\0') putcha(*(ch++)); putcha(32); print(args...); } template<typename ...Args> inline void print(char *ch, Args ...args) { while (*ch != '\0') putcha(*(ch++)); putcha(32); print(args...); } template<typename T, typename ...Args> inline void printl(T x, Args ...args) { fprint(x); putcha(10); printl(args...); } template<typename ...Args> inline void printl(const char *ch, Args ...args) { while (*ch != '\0') putcha(*(ch++)); putcha(10); printl(args...); } template<typename ...Args> inline void printl(char *ch, Args ...args) { while (*ch != '\0') putcha(*(ch++)); putcha(10); printl(args...); } template<typename T> inline void sprint(T x) { fprint(x); putcha(32); } template<typename T, typename ...Args> inline void sprint(T x, Args ...args) { fprint(x); putcha(32); sprint(args...); } template<typename T> inline void sprint(T *bg, T *ed) { while (bg != ed) sprint(*bg++); } template<typename T> inline void print(T *bg, T *ed) { while (bg != ed) sprint(*bg++); putcha(10); } template<typename T> inline void printl(T *bg, T *ed) { while (bg != ed) print(*bg++); } class AutoFlush { public: ~AutoFlush() { flush(); } } __AutoFlush; } // namespace IO using namespace IO; #define vc vector #define nd node* #define pnd pair<nd, nd> using namespace std; typedef long long ll; typedef long double ld; typedef vector<ll> vll; typedef pair<ll, ll> pll; typedef vc<pll> vpll; typedef vc<vll> vvll; typedef vc<vpll> vvpll; template<const ll MOD> struct mod_mul : std::multiplies<const ll> { ll operator()(const ll a, const ll b) { return (a * b) % MOD; } }; template<typename T> inline void sort(T &a) { sort(a.begin(), a.end()); } template<typename T> inline void unique(T &a) { a.resize(unique(a.begin(), a.end()) - a.begin()); } template<typename T> inline void reverse(T &a) { reverse(a.begin(), a.end()); } const ll INF = 9023372036854775808ll; const ll MOD = 1000000007ll; struct state { int a, b; }; int main() { int n, k; read(n, k); vc<state> a(n); for (auto &i : a) { read(i.a, i.b); if (i.b < 0) i.b = 1e9; } sort(a.begin(), a.end(), [](const auto &x, const auto &y) {return x.b < y.b;}); ld ans = INF; for (int sz = 0; sz < k; ++sz) { vc<vc<ld>> dp(n + 1, vc<ld>((k - sz) + 1, INF)); dp[0][0] = 0; for (int i = 0; i < n; ++i) { for (int cnt = 0; cnt <= k - sz; ++cnt) { int done = i - cnt; if (done < sz) { dp[i + 1][cnt] = min(dp[i + 1][cnt], dp[i][cnt] + ((ld)a[i].b / (done + 1))); } else { dp[i + 1][cnt] = min(dp[i + 1][cnt], dp[i][cnt]); } if (cnt + 1 <= k - sz) dp[i + 1][cnt + 1] = min(dp[i + 1][cnt + 1], dp[i][cnt] + (ld)a[i].a / (sz + 1)); } } ans = min(ans, dp[n][k - sz]); } cout.precision(18); cout << 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...