题意:
给n个元素,每个元素有两个属性(v,w),现在要从中选k个,使sum(v)/sum(k)最大。
分析:
参数搜索的入门题,牛顿迭代比二分快很多。
代码:
//poj 3111
//sep9
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxN=100024;
int n,k;
double s0,s1;
struct Node
{int v,w;double tmp;int ids;bool operator<(const Node& x)const{return tmp>x.tmp;}
}a[maxN];double get_v()
{int sum_v=0,sum_w=0;for(int i=0;i<k;++i)sum_v+=a[i].v,sum_w+=a[i].w; return sum_v*1.0/sum_w;
}int main()
{scanf("%d%d",&n,&k);for(int i=0;i<n;++i){scanf("%d%d",&a[i].v,&a[i].w);a[i].ids=i+1; }s0=get_v(); while(1){for(int i=0;i<n;++i)a[i].tmp=a[i].v-s0*a[i].w;nth_element(a,a+k,a+n);s1=get_v(); if(fabs(s0-s1)<1e-8)break;s0=s1; }printf("%d",a[0].ids);for(int i=1;i<k;++i)printf("% d",a[i].ids);return 0;
}