FatMouse’ Trade
题意:
FatMouse准备了M磅猫粮,它想和守卫仓库的猫进行交易,因为仓库里有它最爱吃的食物Javabean。
仓库里有N个房间,在第i间房间里有J[i]磅Javabean,需要用F[i]磅猫粮来进行交换。FatMouse不必买在房间里的全部Javabean,他可以给猫F[i]*a%磅猫粮,来换取J[i]*a%磅的Javabean,其中a是一个实数。现在FatMouse给您布置家庭作业,请您告诉他,他最多能够获得多少磅Javabean。
输入
输入包含多个测试用例。每个测试用例的第一行给出两个非负整数M和N,接下来的N行每行给出两个非负整数J[i]和F[i],最后一个测试用例是两个-1,所有整数的值不超过1000。
输出
对于每个测试用例,在一行上输出一个3位小数的实数,这个实数是FatMouse能够通过交易得到的最大数量的Javabean。
题解:用 J[i] 除以 F[i],结果为 v[i];然后,对 v 写 cmp 按由大到小的顺序进行排序。最后在加个百分比就好了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#define ll unsigned long long
const int inf=0x3f3f3f3f;
using namespace std;
struct node{
double j;
double f;
double v;
}a[2000];
bool cmp(node x,node y)
{
return x.v>y.v;
}
int main()
{
int M,N;
while(cin>>M>>N,M!=-1&&N!=-1)
{
double sum=0;
for(int i=1;i<=N;i++)
{
cin>>a[i].j>>a[i].f;
a[i].v=a[i].j/a[i].f;
}
sort(a+1,a+1+N,cmp);
int k=1;
for(int i=1;i<=N;i++)
{
if(M>a[i].f)
{
sum+=a[i].j;
M-=a[i].f;
}else{
sum=sum+M*a[i].v;
break;
}
}
printf("%.3f\n",sum);
}
return 0;
}