K Besk [POJ 3111]
描述
Demy有n颗宝石。她的每个珠宝都有一些价值vi和重量wi。自从丈夫约翰在最近的金融危机爆发后,已经决定出售一些珠宝。她决定自己会保留最好的珠宝。她决定保留这样的宝石,使他们的具体价值尽可能大。也就是说,表示某组宝石S = {i1,i2,...,ik}的具体值。
Demy想选择这样的k宝石,他们的具体值是最大可能的。帮助她这样做。
输入
输入文件的第一行包含n - Demy得到的珠宝数量,k - 她想保留的珠宝数量(1≤k≤n≤100 000)。
以下n行包含两个整数,每个-vi和wi(0≤vi≤10e6,1≤wi≤10e6,所有vi的和和全部wi之和不超过10e7)。
输出
输出k个数字 - 戴姆必须保留的珠宝数量。如果有几个解决方案,输出任何一个。
样例输入
3 2
1 1
1 2
1 3
样例输出
1 2
题目大意:
n个珠宝,每个珠宝对应一个重量wi和价值vi,现在要从中找出k个,使的这k个珠宝的单位重量的价值最大,输出这k个珠宝的编号。
解题思路:
首先,我们给出一个贪心思路:计算出每个珠宝的单位价值,从大到小选择k个,这个贪心思路是显然错误的。感性证明:单位价值只体现了比值,在数值大小不一样的时候,比值不可做加法。
所以,我们来换一个角度:
我们设一个集合S的单位价值≥x
则有
∑vi / ∑wi ≥ x (i∈S)
变形得
∑(vi - x × wi )≥0(i∈S)
所以,对vi-x×wi排序,选择前k个,检验是否≥0
而x我们可以通过二分来枚举
Code
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define ll long long
#define inf (1<<30)
#define eps (1e-15)
#define maxn 100005
#define rep(i,a,b) for(RG i=a;i<=b;i++)
#define per(i,a,b) for(RG i=a;i>=b;i--)
using namespace std;
int n,k;
struct Dat{
double v,w;
}dat[maxn];
double tmp[maxn];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline bool cmp(const double &a,const double &b)
{
return a>b;
} inline bool judge(double x)
{
rep(i,,n) tmp[i]=dat[i].v-x*dat[i].w;
sort(tmp+,tmp++n,cmp);
double sum=;
rep(i,,k) sum+=tmp[i];
return sum>=;
} struct Ans{
int id;
double val;
}ans[maxn]; inline bool cmp2(const Ans &a,const Ans &b)
{
return a.val>b.val;
} inline void work(double x)
{
rep(i,,n) ans[i].id=i,ans[i].val=dat[i].v-x*dat[i].w;
sort(ans+,ans++n,cmp2);
rep(i,,k) printf("%d ",ans[i].id);
} void solve()
{
double l=,r=inf;
rep(i,,)
{
double mid=(l+r)/;
if(judge(mid)) l=mid;
else r=mid;
}
work(r);
} int main()
{
n=read(),k=read();
rep(i,,n) dat[i].v=read(),dat[i].w=read();
solve();
return ;
}
点击展开代码
K Besk [POJ 3111]的更多相关文章
- Divide and conquer:K Best(POJ 3111)
挑选最美的珠宝 题目大意:挑选k个珠宝使得∑a/∑b最大,输出组合数 最大化平均值的标准题型,二分法就好了,一定要注意范围(10e-7),如果是10e-8就会tle,10e-6就是wa #inclu ...
- poj 3111 K Best 最大化平均值 二分思想
poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...
- POJ 3111 K Best(01分数规划)
K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 9876 Accepted: 2535 Case Time ...
- POJ 3111 K Best(二分答案)
[题目链接] http://poj.org/problem?id=3111 [题目大意] 选取k个物品,最大化sum(ai)/sum(bi) [题解] 如果答案是x,那么有sigma(a)>=s ...
- poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...
- POJ 3111 K Best(最大化平均值)
题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...
- POJ 3111 K Best
二分,排序,贪心. 最优比率生成树,可以二分$+$贪心来实现,不过这样做精度不行. 如果是这样一个问题,该如何解决:问你$n$个里面选择$k$个,能否使得$\frac{{\sum\limits_{j ...
- POJ - 3111 K Best 0-1分数规划 二分
K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 12812 Accepted: 3290 Case Time ...
- POJ - 3111 K Best(二分)
包含一些ai和bi的集用S来表示,x = max(sigma(ai)/sigma(bi),i 属于S) ,k 表示S的大小,k= |S|. x和k之间具有单调性.k0 < k1 → x0 ≥ x ...
随机推荐
- 【C++ Primer | 11】关联容器(一)
在multimap或multiset中查找元素 第二种方法解释: #include <iostream> #include <utility> #include <ite ...
- Nancy 寄宿IIS
一:简介 Nancy是一个轻量级的独立的框架,下面是官网的一些介绍: Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台,框架的目标是保持尽可能多的方 ...
- Top 查看某些或者某个进程(top -p pid)
https://blog.csdn.net/zhangfn2011/article/details/7488746?utm_source=blogxgwz5
- c++ char数组形式的字符串 与输入输出
1. c风格字符串,和strlen函数 #include "stdafx.h" #include <iostream> using std::cout; using s ...
- VS2013 快捷键 与 RESHARPER 冲突(转)
1.VS设置工具-->选项-->环境-->键盘-->重置 2.RESHARPER -->Options-->Environment → Keyboard & ...
- 导出CSV乱码
导出CSV,无论是什么格式,excel打卡都是乱码 需要加上 echo "\xEF\xBB\xBF"; header("Content-Disposition:attac ...
- cf666 C. Codeword 组合数学
题解: 首先暴力很显然 f[i][j]表示到第i个位置,串匹配到j 这样每次是n^2的 我们假设每个位置匹配的第一个位置 然后从这个到上一个位置一定不能等于这个串的值 ans=simga{i,C(i- ...
- python + seleinum +phantomjs 设置headers和proxy代理
python + seleinum +phantomjs 设置headers和proxy代理 最近因为工作需要使用selenium+phantomjs无头浏览器,其中遇到了一些坑,记录一下,尤 ...
- Ajax技术使用之ajax与模态框结合的妙用
Ajax技术使用之ajax与模态框结合的妙用 要求: 使用ajax的方式提交数据:https://www.cnblogs.com/-wenli/p/10470063.html 使用模态框完成增加数据, ...
- redis初步入门(2)
一.redis持久化 1.redis是一个内存数据库,当redis服务器重启,或者电脑关机重启,数据会丢失,所以需要将redis内存中的数据持久化保存到硬盘文件中. 2.redis持久化机制 (1)R ...