K Best(最大化平均值)

题目链接:https://cn.vjudge.net/contest/279225#problem/H
题目大意:这个Demy由于家庭经济困难了,所以要卖掉她n个珠宝中的一部分来维持家庭生活,但是她想留下平均价值最高的k个珠宝,然后要我们帮她算要留下哪些珠宝才能达到目的。
这个就是跟上道题一样的推个式子就完事了,我就不再写了,求和符号好难打耶,直接看上一篇嘛:https://blog.csdn.net/weixin_44049850/article/details/86562201
直接贴代码了哦

#include <stdio.h>
#include <algorithm>
#define INF 100005
#define MAX 0x3f3f3f3f
using namespace std;
int n,k;
struct node
{
    double v,w,tcmp;
    int IP;
} a[INF];
bool cmp(node n1,node n2)
{
    return n1.tcmp>n2.tcmp;
}
bool judge(double x)
{
    double ans=0;
    for(int i=0; i<n; i++)
    {
        a[i].tcmp=a[i].v-a[i].w*x;
    }
    sort(a,a+n,cmp);
    for(int i=0; i<k; i++)
    {
        ans+=a[i].tcmp;
    }
    return ans>=0;
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=0; i<n; i++)
        {
            scanf("%lf%lf",&a[i].v,&a[i].w);
            a[i].IP=i+1;//这个IP就是存是第几个珠宝的,在刚开始输入的时候把这个值给附上,后边即使排序这个值也不会变,我刚开始不知道咋想的把这个的赋值放在了judge函数里,所以wa了一发……,就是这儿嘛需要注意一下,其他就没什么了,跟上道题是一样的
        }
        double max_,min_,mid;
        max_=MAX;
        min_=0;
        while(max_-min_>=1e-8)
        {
            mid=(max_+min_)/2;
            if(judge(mid))
                min_=mid;
            else
                max_=mid;
        }
        for(int i=0; i<k; i++)
            printf("%d%c",a[i].IP," \n"[i==k-1]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44049850/article/details/86562269
今日推荐