题目链接:https://cn.vjudge.net/contest/279225#problem/H
题目大意:这个Demy由于家庭经济困难了,所以要卖掉她n个珠宝中的一部分来维持家庭生活,但是她想留下平均价值最高的k个珠宝,然后要我们帮她算要留下哪些珠宝才能达到目的。
这个就是跟上道题一样的推个式子就完事了,我就不再写了,求和符号好难打耶,直接看上一篇嘛:https://blog.csdn.net/weixin_44049850/article/details/86562201
直接贴代码了哦
#include <stdio.h>
#include <algorithm>
#define INF 100005
#define MAX 0x3f3f3f3f
using namespace std;
int n,k;
struct node
{
double v,w,tcmp;
int IP;
} a[INF];
bool cmp(node n1,node n2)
{
return n1.tcmp>n2.tcmp;
}
bool judge(double x)
{
double ans=0;
for(int i=0; i<n; i++)
{
a[i].tcmp=a[i].v-a[i].w*x;
}
sort(a,a+n,cmp);
for(int i=0; i<k; i++)
{
ans+=a[i].tcmp;
}
return ans>=0;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&a[i].v,&a[i].w);
a[i].IP=i+1;//这个IP就是存是第几个珠宝的,在刚开始输入的时候把这个值给附上,后边即使排序这个值也不会变,我刚开始不知道咋想的把这个的赋值放在了judge函数里,所以wa了一发……,就是这儿嘛需要注意一下,其他就没什么了,跟上道题是一样的
}
double max_,min_,mid;
max_=MAX;
min_=0;
while(max_-min_>=1e-8)
{
mid=(max_+min_)/2;
if(judge(mid))
min_=mid;
else
max_=mid;
}
for(int i=0; i<k; i++)
printf("%d%c",a[i].IP," \n"[i==k-1]);
}
return 0;
}