POJ 3111 K Best(二分答案)
【题目链接】 http://poj.org/problem?id=3111
【题目大意】
选取k个物品,最大化sum(ai)/sum(bi)
【题解】
如果答案是x,那么有sigma(a)>=sigma(b*x)
至于选取,就可以根据a-b*x排序,贪心选取即可。
对于输出物品的id,因为在不断逼近结果的过程中,排序的结果也不断在调整
所以我们最后的得到的排序结果的前k个就是答案。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=101000;
struct data{int a,b,id;}p[N];
int n,k,ans[N];
double m;
bool cmp(data a,data b){return a.a-m*a.b>b.a-m*b.b;}
bool check(double x){
m=x;
sort(p+1,p+n+1,cmp);
double tot_v=0,tot_w=0;
for(int i=1;i<=k;i++){tot_v+=p[i].a;tot_w+=p[i].b;}
return tot_v/tot_w>x;
}
int main(){
while(~scanf("%d%d",&n,&k)){
double l=0,r=0;
for(int i=1;i<=n;i++)scanf("%d%d",&p[i].a,&p[i].b),p[i].id=i,r=max(r,(double)p[i].a/p[i].b);
for(int i=1;i<=100;i++){
double mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}for(int i=1;i<=k;i++)ans[i]=p[i].id;
sort(ans+1,ans+k+1);
for(int i=1;i<k;i++)printf("%d ",ans[i]);
printf("%d\n",ans[k]);
}return 0;
}
POJ 3111 K Best(二分答案)的更多相关文章
- POJ 3111 K Best ( 二分 )
题意 : 给出 N 个物品的价值和重量,然后要求选出 K 个物品使得选出来物品的单位重量价值最大,最后输出被选物品的编号. 分析 : 很容易去想先算出每个物品的单位价值然后升序排序取前 K 个,但是 ...
- 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}{3897}{Maze Stretching}{二分答案+BFS}
题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...
- POJ 1064 Cable master (二分答案)
题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...
- POJ 3484 Showstopper(二分答案)
[题目链接] http://poj.org/problem?id=3484 [题目大意] 给出n个等差数列的首项末项和公差.求在数列中出现奇数次的数.题目保证至多只有一个数符合要求. [题解] 因为只 ...
- POJ 3579 Median(二分答案+Two pointers)
[题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
<题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
随机推荐
- 现代OpenGL教程 01 - 入门指南
原文链接传送门 译序 早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNormal等固定管线API.后来工作需要接触DirectX9,shader也只是可选项而已,跟固定管线一起 ...
- 正式学习React (七) react-router 源码分析
学习react已经有10来天了,对于react redux react-redux 的使用流程和原理,也已经有一定的了解,在我上一篇的实战项目里,我用到了react-route,其实对它还只是 停留在 ...
- 将一段含有0的字符数组赋给string
string有个成员函数,assign() 可以这样: string str; str.assign(temp, sizeof(temp));
- Elf 32
[CentOS]安装软件:/ld-linux.so.2: ELF interpreter解决 环境: [orangle@localhost Downloads]$ uname -m&&am ...
- 分享5个主流的HTML5开发工具
HTML5被看做是web开发者创建流行web应用的利器,增加了对视频和Canvas 2D的支持.用HTML5的优点主要在于,这个技术可以进行跨平台的使用.比如你开发了一款HTML5的游戏,你可以很轻易 ...
- linux之SQL语句简明教程---ORDER BY
到目前为止,我们已学到如何藉由 SELECT 及WHERE 这两个指令将资料由表格中抓出.不过我们尚未提到这些资料要如何排列.这其实是一个很重要的问题.事实上,我们经常需要能够将抓出的资料做一个有系统 ...
- 图片拉伸: stretchableImageWithLeftCapWidth
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight: (NSInteger)topCa ...
- POJ 1724 最短路费用限制
迪杰斯塔拉裸题 最大花费 n个点 m条有向边 起点终点 路径长度 路径花费 问:在花费限制下,最短路径的长度 #include <iostream> #include <string ...
- VMware Workstation虚拟机使用ISO映像文件
VMware Workstation虚拟机使用ISO映像文件 VMware Workstation虚拟机使用ISO映像文件
- Sereja and Suffixes(思维)
Sereja and Suffixes Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...