Peking University Online Judge 2976 Dropping tests
二分探索以外出来ない人ですか?(呆れ)
0.5^20≒10^-6で、探索する値は0.0~100.0の範囲内なので、20回も二分探索すれば十分かと(100回やれば間違いないけど、1000回まわすとTLEします)
類題:https://beta.atcoder.jp/contests/abc034/tasks/abc034_d
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; static const int MAX_N = 1000; int N, K; int a[MAX_N], b[MAX_N]; int main(){ for(;;){ scanf("%d %d", &N, &K); if(N == 0 && K == 0) break; for(int i = 0; i < N; i++) scanf("%d", &a[i]); for(int i = 0; i < N; i++) scanf("%d", &b[i]); double lb = 0.0, ub = 100.0; for(int i = 0; i < 20; i++){ double mid = lb + (ub - lb) / 2.0; double x[MAX_N]; for(int j = 0; j < N; j++){ x[j] = (double)a[j] - mid / 100.0 * (double)b[j]; } sort(x, x + N); reverse(x, x + N); double sum = 0.0; for(int j = 0; j < N - K; j++) sum += x[j]; if(sum > 0.0) lb = mid; else ub = mid; } printf("%d\n", (int)floor(lb + 0.5)); } return 0; }