题意:
给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; }
原文地址:http://blog.csdn.net/sepnine/article/details/45081233