假定一個答案,根據這個答案,計算
根據排序,此時我們並不是把最大的個相加跟0比較,而是把最大的個的
如果
結束循環,否則
繼續循環。
逐漸逼近最優解的過程。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef double db;
const int N=1e5+5;
const db eps=1e-8;
db v[N],w[N];
struct node
{
db s;
int idx;
bool operator < (const node B) const{return s<B.s;}
}s[N];
int main()
{
int n,k;
db ans,tmp;
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=n;i++) scanf("%lf%lf",&v[i],&w[i]);
ans=1e7;
tmp=0;
while(fabs(tmp-ans)>eps)
{
ans=tmp;
for(int i=1;i<=n;i++)
{
s[i].s=v[i]-ans*w[i];
s[i].idx=i;
}
sort(s+1,s+n+1);
db up=0,down=0;
for(int i=n;i>n-k;i--) up+=v[s[i].idx],down+=w[s[i].idx];
tmp=up/down;
}
for(int i=n;i>n-k;i--) printf("%d ",s[i].idx);
}
}