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;
}
贪心的反例是显然的,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;
}
相关文章推荐
- poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
- POJ 3111 K Best 二分 最大化平均值
- 【POJ】3111 - K Best 二分->最大化平均值
- poj 3122 二分水题
- POJ 3111 K Best (01分数规划+二分)
- POJ_3111_K_Best_(二分,最大化平均值)
- POJ - 3111 K Best (二分 + 01分数规划)
- POJ 3111 K Best 二分(最小化平均值)
- poj 3111(二分)
- Poj 3122 Pie【基础二分】水题
- POJ - 3111 K Best(二分)
- K Best POJ - 3111 (二分最大化平均值,注意用G++提交,不然TLE)
- POJ---3111(二分,最大化平均值)
- K Best poj 3111 (01分数规划---二分搜索)
- poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111
- K Best POJ - 3111 (二分最大化平均值,注意用G++提交,不然TLE)
- POJ 3111 K Best(二分——最大化平均值)
- POJ 2976 Dropping tests、3111 K Best (二分搜索)
- poj 3111 K Best(二分-最大化平均值)
- K Best POJ - 3111 (二分最大化平均值,注意用G++提交,不然TLE)