描述
  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]的更多相关文章

  1. Divide and conquer:K Best(POJ 3111)

     挑选最美的珠宝 题目大意:挑选k个珠宝使得∑a/∑b最大,输出组合数 最大化平均值的标准题型,二分法就好了,一定要注意范围(10e-7),如果是10e-8就会tle,10e-6就是wa #inclu ...

  2. poj 3111 K Best 最大化平均值 二分思想

    poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...

  3. POJ 3111 K Best(01分数规划)

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 9876   Accepted: 2535 Case Time ...

  4. POJ 3111 K Best(二分答案)

    [题目链接] http://poj.org/problem?id=3111 [题目大意] 选取k个物品,最大化sum(ai)/sum(bi) [题解] 如果答案是x,那么有sigma(a)>=s ...

  5. poj 3111 K Best (二分搜索之最大化平均值之01分数规划)

    Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...

  6. POJ 3111 K Best(最大化平均值)

    题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...

  7. POJ 3111 K Best

    二分,排序,贪心. 最优比率生成树,可以二分$+$贪心来实现,不过这样做精度不行. 如果是这样一个问题,该如何解决:问你$n$个里面选择$k$个,能否使得$\frac{{\sum\limits_{j ...

  8. POJ - 3111 K Best 0-1分数规划 二分

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 12812   Accepted: 3290 Case Time ...

  9. 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 ...

随机推荐

  1. HDU 1075 What Are You Talking About (stl之map映射)

    What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K ...

  2. A.Ocean的礼物线段树

    A: Ocean的礼物  Time Limit: 2 s Memory Limit: 128 MB  Submit My Status  Problem Description  皇家理工存在一段很神 ...

  3. 标准C语言实现基于TCP/IP协议的文件传输

    TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下:  1.Socket系统调用  为了进行网络I/O,服务器和客户机两 ...

  4. 【SpringBoot】常用注解

    @EnableAutoConfiguration 启动自动装载:使用了这个注解之后,所有引入的jar的starters都会被自动注入.这个类的设计就是为starter工作的. @RestControl ...

  5. 修改ini文件的批处理

    用VBS更简单: vbs代码: On Error Resume Next Dim Fso,TxtFl,Str Set Fso = CreateObject("Scripting.FileSy ...

  6. vue-cli 部分浏览器不支持es6的语法-babel-polyfill的引用和使用

    npm install --save-dev babel-polyfill babel-polyfill用正确的姿势安装之后,引用方式有三种: 1.require("babel-polyfi ...

  7. 函数防抖 debounce

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 咸鱼入门到放弃1--JDBC

    JDBC参考微博https://www.cnblogs.com/surfcater/p/10224502.html 主要内容 1.JDBC相关概念 2.JDBC常用接口 driver connecti ...

  9. 010 pandas的DataFrame

    一:创建 1.通过二维数组进行创建 2.取值 取列,取位置的值 3.切片取值 这个和上面的有些不同,这里先取行,再取列 4.设定列索引 这里使用的行索引与上面不同. 5.通过字典的方式创建 6.索引 ...

  10. 大数据及Hadoop的概述

    一.大数据存储和计算的各种框架即工具 1.存储:HDFS:分布式文件系统   Hbase:分布式数据库系统   Kafka:分布式消息缓存系统 2.计算:Mapreduce:离线计算框架   stor ...