N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大。
Input
第1行:包括2个数N, K(1 <= K <= N <= 50000)
第2 - N + 1行:每行2个数Wi, Pi(1 <= Wi, Pi <= 50000)
Output
输出单位体积的价值(用约分后的分数表示)。
Input示例
3 2
2 2
5 3
2 1
Output示例
3/4
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int MAXN = 50000 + 50;
const double ESP = 1e-6;
struct Obj
{
int w, p;
double v;
};
bool cmp(Obj a, Obj b)
{
return a.v > b.v;
}
int gcd(int a, int b)
{
if (b == 0)
{
return a;
}
return gcd(b, a%b);
}
Obj input[MAXN];
int n, k;
int resultP;
int resultW;
bool check(double r)
{
for (int i = 0; i < n; i++)
{
input[i].v = input[i].p - r * input[i].w;
}
sort(input, input + n, cmp);
resultP = 0;
resultW = 0;
double sum = 0;
for (int i = 0; i < k; i++)
{
resultP += input[i].p;
resultW += input[i].w;
sum += input[i].v;
}
if (sum >= 0)
{
return true;
}
return false;
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> input[i].w >> input[i].p;
}
double left = 0;
double right = MAXN;
double mid;
while (fabs(right - left) > ESP)
{
mid = left + (right - left)/2;
if (check(mid))
{
left = mid;
}
else
{
right = mid;
}
}
int d = gcd(resultP, resultW);
resultP /= d;
resultW /= d;
cout << resultP << "/" << resultW << endl;
return 0;
}