当前位置: 代码迷 >> 综合 >> poj 3111 K Best 参数搜索之牛顿迭代法
  详细解决方案

poj 3111 K Best 参数搜索之牛顿迭代法

热度:79   发布时间:2024-01-19 05:45:24.0

题意:

给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;	
}