您的位置:首页 > 运维架构

POJ 2976 Dropping tests【二分 最大化平均值】

2015-06-15 17:28 429 查看
题意:定义最大平均分为 (a1+a2+a3+---+an)/(b1+b2+---+bn),求任意去除k场考试的最大平均成绩

和挑战程序设计上面的最大化平均值的例子一样

判断是否存在x满足条件 (a1+a2+a3+---+an)/(b1+b2+---+bn)>=x

把这个不等式变形就得到

E(ai-x*bi )>=0

所以可以对ai-x*bi降序排序,取前n-k个,看它们的和是不是>=0(或者升序排,取后n-k个)

后来搜题解发现是01分数规划,列的式子好像都差不多-------

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=10005;

double a[maxn],b[maxn],y[maxn];
int n,k;

int ok( double x){
for(int i=1;i<=n;i++) y[i]= a[i]-b[i]*x;
sort(y+1,y+n+1);
double ans=0;
for(int i= k+1;i<=n;i++) ans+=y[i];

return ans>=0;
}

int main(){
while(scanf("%d %d",&n,&k)!=EOF){
if(n==0&&k==0) break;
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
for(int i=1;i<=n;i++) scanf("%lf",&b[i]);

double lb=0,ub=1.00,mid;
for(int i=0;i< 100;i++){
mid=(lb+ub)/2;
if(ok(mid)) lb=mid;
else ub=mid;
}
printf("%d\n",(int)(100*lb+0.5));
}
return 0;
}


View Code

好饿~~(╯﹏╰)b

加油啊---------------goooooooooo----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: