链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小咪是一个土豪手办狂魔,这次他去了一家店,发现了好多好多(n个)手办,但他是一个很怪的人,每次只想买k个手办,而且他要让他花的每一分钱都物超所值,即:买下来的东西的总价值/总花费=max。请你来看看,他会买哪些东西吧。
输入描述:
多组数据。
第一行一个整数T,为数据组数。
接下来有T组数据。
对于每组数据,第一行两个正整数n,k,如题。
接下来n行,每行有两个正整数ci,vi。分别为手办的花费和它对于小咪的价值。
输出描述:
对于每组数据,输出一个数,即能得到的总价值/总花费的最大值。精确至整数。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n,k;
struct fx{ll c,v;double y;
};
fx a[10003];
ll check(double x)
{for(ll i=1;i<=n;i++){a[i].y=a[i].c*1.0-x*a[i].v;}sort(a+1,a+1+n,[](fx p,fx q){return p.y>q.y;});double f=0;for(ll i=1;i<=k;i++){f+=a[i].y;}return f<0;
}
void solve()
{cin>>n>>k;for(ll i=1;i<=n;i++){cin>>a[i].v>>a[i].c;}double l=0;double r=0;for(ll i=1;i<=n;i++)r+=a[i].c;for(ll i=0;i<100;i++){double mid=l+(r-l)/2;if(check(mid))r=mid;else l=mid;}cout<<ll(l)<<'\n';
}
int main()
{ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);ll t=1;cin>>t;while(t--)solve();return 0;
}