[POJ2976][分數規劃]Dropping tests[水題]

[題目大意]

你考了N次試,第i次考試有bi道題,你通過了ai道。現在選擇(N-K)次考試,使得總通過率最高。(總通過率 = 選擇的考試的總通過數/選擇的考試的總題目數)


[分析]

第一反應是貪心,可惜貪心不對,樣例給的很明顯了。想一想,利用分數規劃,二分答案,每次判斷答案是否可行,這時候就可以用貪心了。

注意精度要卡小一點,以前卡1e-4就掛了,卡到1e-7就過了……



#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

//Global Variables & Definitions
int N, K;
int a[1010], b[1010];
double w[1010];
//End Global Variables & Definitions

//Main Structure
const double eps = 1e-7;

double solve() {
	for(int i = 0;i < N;++i) scanf("%d", &a[i]);
	for(int i = 0;i < N;++i) scanf("%d", &b[i]);
	
	double L = 0.0, R = 1.1;
	while(R - L >= eps) {
		double mid = (L + R) / 2.;
		
		for(int i = 0;i < N;++i) w[i] = a[i] - b[i] * mid;
		sort(w, w + N);
		
		double ans = 0.;
		for(int i = K;i < N;++i) ans += w[i];
		
		if(ans > 0.0) 
			L = mid;
		else
		    R = mid;
	}
	
	return (L + R) / 2.;
}

int main() {
	while(scanf("%d%d", &N, &K) && N) printf("%.0f\n", solve() * 100);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章