POJ 3111 K Best (最大化平均值,贪心 二分)难度⭐⭐⭐

题目来源:
【题意】
有n个物品的重量和价值分别是wi,vi,从中选取k个物品使得单位重量的价值最大。
输出格式:
输出一行物品的编号。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
using namespace std;
typedef long long ll;
const ll N=1e5+7;
const double mod=2147483647.0;
const double EPS=1e-6;
ll n,k;
double f[N];
#undef mid
struct node
{
    double v,w,av;
    ll id;
    bool operator<(const node &t)const
    {
        return av>t.av;
    }
}arr[N];
inline bool check(double x)
{
    for(int i=1;i<=n;++i)
        arr[i].av=arr[i].v-arr[i].w*x;
    sort(arr+1,arr+1+n);
    double sum=0;
    for(int i=1;i<=k;++i)
        sum+=arr[i].av;
    return sum>=0;
}
void solve()
{
    double l=0,r=mod;
    while(l+EPS<=r)
    {
        double mid=(l+r)/2;
        if(check(mid))
            l=mid;
        else r=mid;
    }
}
int main()
{
    while(~scanf("%lld %lld",&n,&k))
    {
        for(ll i=1;i<=n;++i)
        {
            scanf("%lf %lf",&arr[i].v,&arr[i].w);
            arr[i].id=i;
        }
        solve();
        for(ll i=1;i<=k;++i)
            printf("%lld%s",arr[i].id,i==k?"\n":" ");
    }
    return 0;
}

有任何疑问欢迎评论哦虽然我真的很菜

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-18 16:32
quench@0916:一顿操作猛如虎,一看工资2500
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
点赞 评论 收藏
分享
05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
点赞 评论 收藏
分享
面试官问:为什么不考研?该怎么回答啊😭我说现在的就业环境差到底了,还有就是我不想学数学,感觉面试官笑容都凝固了😢
DayDayNoBug的鲜芋球:我说的是“上学期其实尝试过去探索一些研究的方向,但感觉那些对我来说都没有很大的吸引力,相比起研究我可能更喜欢开发这种实践性的东西,它会让我觉得很有意思并且会为之深入进去”(虽然也不知这个回答怎么样哈哈哈哈哈哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务