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

本文介绍了一道名为“卖宝救夫”的经典问题,通过动态规划算法解决如何选择价值最大的k件珠宝进行保留的问题。该问题要求从n件不同价值和重量的珠宝中挑选出k件,使总价值最大化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

https://cn.vjudge.net/problem/POJ-3111

题目大意:

卖宝救夫:Demy要卖珠宝,n件分别价值vi 重 wi,她希望保留k件使得

最大。

解题思路:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int INF = 1e7;
 7 const int maxn = 100005;
 8 int n, m;
 9 double w[maxn], v[maxn], y[maxn];
10 bool judge(double x)
11 {
12     for(int i = 1; i <= n; i++)
13         y[i] = v[i] - x * w[i];
14     sort(y + 1, y + n + 1);
15 
16     double sum = 0;
17     for(int i = 1, j = n; i <= m; i++, j--)
18         sum += y[j];
19     return sum >= 0;
20 }
21 struct node
22 {
23     double x;
24     int id;
25     bool operator <(const node& a)const
26     {
27         return x > a.x;
28     }
29 }ans[maxn];
30 int main()
31 {
32     cin >> n >> m;
33     for(int i = 1; i <= n; i++)
34         cin >> v[i] >> w[i];
35     double l = 0, r = INF;
36     for(int i = 0; i < 50; i++)
37     {
38         double mid = (l + r) / 2;
39         if(judge(mid))l = mid;
40         else r = mid;
41     }
42     for(int i = 1; i <= n; i++)
43     {
44         ans[i].id = i;
45         ans[i].x = v[i] - l * w[i];
46     }
47     sort(ans + 1, ans + n + 1);
48     printf("%d", ans[1].id);
49     for(int i = 2; i <= m; i++)
50     {
51         printf(" %d", ans[i].id);
52     }
53     puts("");
54     return 0;
55 }

 

转载于:https://www.cnblogs.com/fzl194/p/8989526.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值