POJ 3111(二分查找平均值)

原创 2016年10月25日 08:28:38

Time Limit: 8000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu

 Status

Description

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

Since her husband John got broke after recent financial crises, Demy has decided to sell some jewels. She has decided that she would keep k best jewels for herself. She decided to keep such jewels that their specific value is as large as possible. That is, denote the specific value of some set of jewels S = {i1i2, …, ik} as

.

Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.

Input

The first line of the input file contains n — the number of jewels Demy got, and k — the number of jewels she would like to keep (1 ≤ k ≤ n ≤ 100 000).

The following n lines contain two integer numbers each — vi and wi (0 ≤ vi ≤ 106, 1 ≤ wi ≤ 106, both the sum of all vi and the sum of all wi do not exceed 107).

Output

Output k numbers — the numbers of jewels Demy must keep. If there are several solutions, output any one.

Sample Input

3 2
1 1
1 2
1 3

Sample Output

1 2

注意二分的原理

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 100010;
typedef long long LL;
const double inf = 100000000;
struct node1
{
    int v, w;


}p[N];


struct node2
{
    double y;
    int index;


}q[N];


int judge(double x);
int cmp(node2 a,node2 b)
{
    return a.y>b.y;
}
int n, m;


int main()
{


    while(scanf("%d %d", &n, &m)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d %d", &p[i].v, &p[i].w);
        }
        double l=0, r=inf;
        for(int i=0;i<=50;i++)
        {
            double mid=(l+r)/2;
            if(judge(mid))
            {
                l=mid;
            }
            else
            {
                r=mid;
            }
        }
        for(int i=0;i<m;i++)
        {
            printf("%d%c",q[i].index+1,i==m-1?'\n':' ');
        }
    }
    return 0;
}


int judge(double x)
{
    for(int i=0;i<n;i++)
    {
        q[i].index=i;
        q[i].y=p[i].v-p[i].w*x;
    }
    sort(q,q+n,cmp);
    double sum=0;
    for(int i=0;i<m;i++)
    {
        sum+=q[i].y;
    }
   return sum>=0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 3111 K Best(二分搜索,最大化平均值)

K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 7491 Accepted...

poj 3111 K Best 【0-1分数规划】 【二分 or Dinkelbach迭代】

K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 7154   Accepted: 1875 Ca...

POJ - 3111 K Best (二分 + 01分数规划)

K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 8586   Accepte...

二分

Language: Default K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submiss...

poj 3111 Status List (二分 + 贪心 最大化平均值)

@(K ACMer) by 题解工厂题意:有n个东西,每个东西的价值为x重量为y,从中选取k个东西,求价值重量比得最大值t.分析:典型的最大化平均值问题.如果不仔细思考容易按照贪心的思想去做,贪心是简...

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

poj3111 && NYOJ 914 有n个物品的重量和价值分别是w[i]和v[i],从中选出K个物品使得单位重量的价值最大。(1...

POJ3111 K Best 最大化平均值(二分)

题目链接:http://poj.org/problem?id=3111 题目大意:n个珠宝,每个珠宝对应一个重量wi和价值vi,现在要从中找出k个,使的这k个珠宝的单位重量的价值最大,输出这...

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

DescriptionDemy has n jewels. Each of her jewels has some value vi and weight wi.Since her husband J...

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

题目链接: 点我 题目大意: 给出物品的w和v,选出k个物品使得 s值最大。 题目分析: 不能直接按照v/w贪心来做,举个反例: w v 2 2 5 3 2...

poj 3111 二分求最大化平均值

K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 6169   Accepted: 1651 Ca...
  • HTT_H
  • HTT_H
  • 2015年02月15日 19:35
  • 263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3111(二分查找平均值)
举报原因:
原因补充:

(最多只允许输入30个字)