[POJ3111]K Best

来源:

Northeastern Europe 2005, Northern Subregion

思路:

分数规划经典题。二分分数值$x$,判断其是否满足$\sum (v - w \times m) \geq 0$即可。
针对$v - w \times m$从大到小排序,然后对前$k$项求和,检验是否非负。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<functional>
 6 inline int getint() {
 7     char ch;
 8     while(!isdigit(ch=getchar()));
 9     int x=ch^‘0‘;
10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
11     return x;
12 }
13 const double eps=1e-6;
14 const int N=100000;
15 int n,k;
16 struct Jewel {
17     int v,w,id;
18     double sum;
19     bool operator > (const Jewel &x) const {
20         return sum>x.sum;
21     }
22 };
23 Jewel j[N];
24 std::vector<int> ans;
25 inline bool check(const double x) {
26     ans.clear();
27     for(int i=0;i<n;i++) {
28         j[i].sum=j[i].v-j[i].w*x;
29     }
30     std::sort(&j[0],&j[n],std::greater<Jewel>());
31     double sum=0;
32     for(int i=0;i<k;i++) {
33         sum+=j[i].sum;
34         ans.push_back(j[i].id);
35     }
36     return sum>=0;
37 }
38 int main() {
39     n=getint(),k=getint();
40     for(int i=0;i<n;i++) {
41         j[i].v=getint();
42         j[i].w=getint();
43         j[i].id=i+1;
44     }
45     double l=0,r=1000000;
46     while(r-l>=eps) {
47         double mid=(l+r)/2;
48         if(check(mid)) {
49             l=mid;
50         }
51         else {
52             r=mid;
53         }
54     }
55     for(unsigned i=0;i<ans.size();i++) {
56         printf("%d ",ans[i]);
57     }
58     return 0;
59 }
时间: 2024-11-10 07:04:21

[POJ3111]K Best的相关文章

POJ3111 K Best(另类背包+二分+变态精度)

POJ3111 K Best,看讨论区说数据有点变态,精度要求较高,我就直接把循环写成了100次,6100ms过,(试了一下30,40都会wa,50是4000ms) 第一次在POJ上看到下面这种东西还是很好奇的, 一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被Special Judge.Special Judge程序使用输入数据和一些其他信息来判答你程序的输出,并将判答结果返回. Case Time Limit: 2000MS   Special Judge #include <c

POJ3111 K Best —— 01分数规划 二分法

题目链接:http://poj.org/problem?id=3111 K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 11380   Accepted: 2935 Case Time Limit: 2000MS   Special Judge Description Demy has n jewels. Each of her jewels has some value vi and weight wi.

[POJ3111]K Best(分数规划, 二分)

题目链接:http://poj.org/problem?id=3111 求选k对数,使得上述式子值最大.容易想到设左边为一个值,对式子变形以下,得到sigma(v-r*w))==0的时候就是最大的,<0是最小的.二分这个r就行了. 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits>

融合后如何如何后如何如何

http://ypk.39.net/search/all?k=%A6%C6%B6%F5%D6%DD%C4%C4%C0%EF%C2%F2%C3%C0%C9%B3%CD%AAQ%A3%BA%A3%B8%A3%B6%A3%B3%A3%B9%A3%B0%A3%B2%A3%B9%A3%B6%A3%B2%A1%C6 http://ypk.39.net/search/all?k=%A8z%BE%A3%C3%C5%C4%C4%C0%EF%C2%F2%C3%C0%C9%B3%CD%AAQ%A3%BA%A3%B8%

哥哥ukulele

http://ypk.39.net/search/all?k=%A1%FB%C6%CE%CC%EF%C4%C4%C0%EF%D3%D0%B0%B2%C0%D6%CB%C0%D2%A9%C2%F4Q%A3%BA%A3%B8%A3%B6%A3%B3%A3%B9%A3%B0%A3%B2%A3%B9%A3%B6%A3%B2%A1%BC http://ypk.39.net/search/all?k=%A1%D3%B8%A3%C7%E5%C4%C4%C0%EF%D3%D0%B0%B2%C0%D6%CB%C0

POJ 3111 K Best &amp;&amp;NYOJ 914 (二分+ 贪心,最大化平均值)

链接:NYOJ:click here, POJ:click here 题意:(最大化平均值,挑战编程P143) 有n个物品的重量和价值分别是w[i]和v[i],从中选出K个物品使得单位重量的价值最大.(1<=k<=n<=10^41<=w[i],v[i]<=10^6) 一般想到的是按单位价值对物品排序,然后贪心选取,但是这个方法是错误的,比如对nyoj的例题来说,从大到小地进行选取,输入的结果是5/7=0.714对于有样例不满足.我们一般用二分搜索来做(其实这就是一个01分数规

51 nod 1105 第K大的数

1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 1](数组A同数组B的组合).求数组C中第K大的数. 例如:A:1 2 3,B:2 3 4.A与B组合成的C包括2 3 4 4 6 8 6 9 12共9个数. I

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

Softmax回归(Softmax Regression, K分类问题)

Softmax回归:K分类问题, 2分类的logistic回归的推广.其概率表示为: 对于一般训练集: 系统参数为: Softmax回归与Logistic回归的关系 当Softmax回归用于2分类问题,那么可以得到: 令θ=θ0-θ1,就得到了logistic回归.所以实际上logistic回归虽然有2个参数向量,但这2个参数向量可以退化到1个参数向量.推广到K个类别,那么就需要K-1个参数向量 参数求解 类似于logistic regression,求最大似然概率,有: 其中1{k=y}为真值