Submission #526439

#TimeUsernameProblemLanguageResultExecution timeMemory
526439sidonLet's Win the Election (JOI22_ho_t3)C++17
100 / 100
430 ms2364 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define dd double
#define minim(X, Y) (X = min(X, Y))

const int Z = 502, INF = 1e18;

int N, K, A[Z], B[Z];
dd ans = INF;
array<int, 2> s[Z];

dd dp[2][Z];
int suf[Z][Z];

int32_t main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N >> K;

	for(int i = 0; i < N; ++i) {
		cin >> A[i] >> B[i];
		if(B[i] < 0) B[i] = INF;
		s[i] = {B[i], A[i]};
	}

	sort(s, s + N);

	for(int i = 0; i < N; ++i) {
		A[i] = s[i][1];
		B[i] = s[i][0];
	}

	for(int i = 0; i < N; ++i) {
		vector<int> v;
		for(int j = i; j < N; ++j) v.push_back(A[j]);
		sort(begin(v), end(v));

		for(int j = 0, sum = 0; j < (int)size(v); ++j)
			suf[i][j+1] = (sum += v[j]);
	}

	for(int c = 0; c <= N; ++c) {
		fill(dp[1], dp[1] + N + 1, INF);
		dp[1][0] = 0;

		for(int i = 0; i < N; ++i) {
			auto &curr = dp[i & 1];
			auto &prev = dp[!(i & 1)];

			for(int k = 0; k <= N; ++k)
				curr[k] = prev[k] + dd(A[i]) / dd(c + 1);

			for(int k = 0; k < N; ++k)
				minim(curr[k+1], prev[k] + dd(B[i]) / dd(k + 1));

			for(int k = 0; k <= N; ++k) {
				int other = (i + 1) - k;
				if(other > K - c) curr[k] = INF;
			}

			int other = K - (i + 1);

			if(0 <= other && other <= (N - i - 1))
				minim(ans, curr[c] + dd(suf[i+1][other]) / dd(c + 1));
		}
	}

	ans = min(ans, dd(suf[0][K]));

	cout << setprecision(10) << fixed << ans;
}
#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...