題目鏈接:https://ac.nowcoder.com/acm/problem/14662
題目描述
小咪是一個土豪手辦狂魔,這次他去了一家店,發現了好多好多(n個)手辦,但他是一個很怪的人,每次只想買k個手辦,而且他要讓他花的每一分錢都物超所值,即:買下來的東西的總價值/總花費=max。請你來看看,他會買哪些東西吧。
輸入描述:
多組數據。
第一行一個整數T,爲數據組數。
接下來有T組數據。
對於每組數據,第一行兩個正整數n,k,如題。
接下來n行,每行有兩個正整數ci,vi。分別爲手辦的花費和它對於小咪的價值。
輸出描述:
對於每組數據,輸出一個數,即能得到的總價值/總花費的最大值。精確至整數。
輸入
1
5 1
1 2
2 3
3 4
4 5
5 6
輸出
2
備註:
分析:
01規劃模型題:
設最大值爲ans,對於上述式子,二分x,的都滿足題意。
代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
double c[N],v[N],sum[N];
int t,n,k;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
scanf("%lf%lf",&c[i],&v[i]);
double l=0,r=1000000,mid;
for(int i=1; i<100; i++)///二分100,就會變的非常小
{
mid=(l+r)/2;
for(int j=0; j<n; j++)
sum[j]=v[j]-mid*c[j];
sort(sum,sum+n,cmp);
double res=0;
for(int i=0; i<k; i++)
res+=sum[i];
if(res>=0.0)
l=mid;
else
r=mid;
}
int index=(int)mid;
printf("%d\n",index);
}
return 0;
}