POJ 3111 K Best 二分 最大化平均值

来源:互联网 发布:java 上级目录 编辑:程序博客网 时间:2024/05/22 08:27

题目链接: 点我
题目大意: 给出物品的w和v,选出k个物品使得
这里写图片描述s值最大。
题目分析: 不能直接按照v/w贪心来做,举个反例:
w v
2 2
5 3
2 1
选1和3,结果是0.75,但选1和2,结果是5/7 = 0.7140
下面搬运一下《挑战程序设计》
这里写图片描述

Problem: 3111       User: ChenyangDuMemory: 1860K       Time: 4360MSLanguage: G++       Result: Accepted#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100000+5,INF = 0x7fffffff;int n,m;double mid;struct jew {int v,w,id;}in[maxn];bool cmp (jew a,jew b){    double aa = (double)a.v - mid*(double)a.w;    double bb = (double)b.v - mid*(double)b.w;    return aa>bb;}int C(double x){    double sum = 0;    for(int i=0;i<m;i++){        jew a = in[i];        sum += (double)a.v - x*(double)a.w;        if(sum<0)return i;    }    return m;}int main(){    //freopen("in.txt","r",stdin);    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++){        scanf("%d%d",&in[i].v,&in[i].w);        in[i].id = i+1;    }    double l = 0,r = INF;    int T = 52;    while(T--){        mid = (l+r)/2;        sort(in,in+n,cmp);        if(C(mid) >= m)l = mid;        else r = mid;    }    for(int i=0;i<m;i++)        printf("%d ",in[i].id);    fclose(stdin);    return 0;}
阅读全文
0 0