本来是条很简单的题,可是细节好多,不会处理,神烦。(最大化平均值)
1.精度问题,需要设置到1e-6内
2.储存问题,把a外置就不行了,,,why??
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1000000+10;
const int INF=1e7+1;
struct node
{
int t;
double sum;
}s[maxn];
int a[maxn],v[maxn],w[maxn],n,k;
int cmp(node l1,node l2)
{
return l1.sum>l2.sum;
}
bool C(double d)
{
for(int i=1;i<=n;i++)
{
s[i].t=i;
s[i].sum=v[i]-d*w[i];
}
sort(s+1,s+n+1,cmp);
double res=0;
for(int i=1;i<=k;i++) //不能把a[i]和res分开写,细节好多,好烦
{
res+=s[i].sum;
a[i]=s[i].t;
}
return res>=0;
}
void solve()
{
double lb=0,ub=INF;
while(ub-lb>1e-6) //精度要求好高
{
double mid=(lb+ub)/2;
if(C(mid)) lb=mid;
else ub=mid;
}
for(int i=1;i<=k;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;i++)
scanf("%d%d",&v[i],&w[i]);
solve();
}
}