小咪买东西(最大化平均值)
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
小咪是一个土豪手办狂魔,这次他去了一家店,发现了好多好多(n个)手办,但他是一个很怪的人,每次只想买k个手办,而且他要让他花的每一分钱都物超所值,即:买下来的东西的总价值/总花费=max。请你来看看,他会买哪些东西吧。
输入描述:
多组数据。
第一行一个整数T,为数据组数。
接下来有T组数据。
对于每组数据,第一行两个正整数n,k,如题。
接下来n行,每行有两个正整数ci,vi。分别为手办的花费和它对于小咪的价值。
输出描述:
对于每组数据,输出一个数,即能得到的总价值/总花费的最大值。精确至整数。
示例1
输入
1 5 1 1 2 2 3 3 4 4 5 5 6
输出
2
备注:
1≤T≤10
1≤n≤104
1≤k≤n
白书144页最大化平均值原题
附ac代码:
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <string> 5 #include <algorithm> 6 using namespace std; 7 const int maxn = 1e4+10; 8 typedef long long ll; 9 int t; 10 int n,k; 11 struct nod 12 { 13 int c; 14 int v; 15 }nu[maxn]; 16 double y[maxn]; 17 double judg(int x) 18 { 19 for(int i=0;i<n;++i) 20 y[i]=nu[i].v-nu[i].c*x; 21 sort(y,y+n); 22 double sum=0; 23 for(int i=0;i<k;++i) 24 sum+=y[n-i-1]; 25 return sum; 26 } 27 int main() 28 { 29 30 scanf("%d",&t); 31 while(t--) 32 { 33 scanf("%d%d",&n,&k); 34 for(int i=0;i<n;++i) 35 { 36 scanf("%d%d",&nu[i].c,&nu[i].v); 37 } 38 int mid; 39 int l=0,r=maxn; 40 while(l<=r) 41 { 42 mid=l+(r-l)/2; 43 if(judg(mid)<0) r=mid-1; 44 else l=mid+1; 45 } 46 printf("%d\n",r); 47 } 48 49 return 0; 50 }