您的位置:首页 > 其它

poj 3111 二分水题

2016-09-02 23:08 260 查看
题意:有n个物品的重量和价值分别是w[i]和v[i],从中选出K个物品使得单位重量的价值最大

贪心的反例是显然的,nyoj的样例就是

本题是个二分的很好例子,可以理解成二分得到一个阈值,然后判断是否够k个,以此得到最优解,而这个正确性也是显然的

#include <cstdio>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)

using namespace std;

const int INF=0x3f3f3f3f;
int n,k;

struct cadongllas
{
double v,w,tmp;
int id;
}s[100005];

bool cmp(cadongllas x,cadongllas y)
{
return x.tmp>y.tmp;
}

bool judge(double d)
{
double sum = 0;
rep (i, 1, n)
s[i].tmp=s[i].v-d*s[i].w;
sort (s + 1, s + 1 + n, cmp);
rep (i, 1, k)
sum+=s[i].tmp;
return sum>=0;
}

int main()
{
while(scanf("%d%d",&n,&k)!=EOF){
rep (i, 1, n)
scanf ("%lf%lf", &s[i].v, &s[i].w), s[i].id = i;
double l = 0, r = 0x7fffffff * 1.0;
rep (i, 0, 101)
{
double mid=(l+r)/2;
if(judge(mid))
l=mid;
else
r=mid;
}
rep (i, 1, k)
printf("%d ",s[i].id);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: