Description
一共有n个房子,每个房子里有老鼠喜欢吃的食物,但是每个房间里的食物的价格不一样。老鼠用m元,问m元最多可以卖多少食物,其中每个房间里的食物可以被分割
Input
多组输入,每组用例第一行为两个证书m和n表示老鼠初始钱数和房间数,之后n行每行两个整数get和pay表示老鼠在这个房间得到get单位的食物,就要付pay元,以0 0结束输入
Output
对于每组用例,输出老鼠用m元最多可以买到多少食物,小数点后保留三位
Sample Input
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
Sample Output
13.333
31.500
Solution
对每个房间的ave=get/pay值排序,每次贪心的拿ave最高的,对于当前能够买到的最高ave值的食物,能买完就买完,不能买完就把剩下的钱全部买这种食物
Code
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 10010
struct node
{
double get,pay;
double ave;//get和pay的比值
}cat[maxn];
int cmp(node a,node b)
{
return a.ave>b.ave;//将比值按降序排
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n))
{
if(m==-1&&n==-1)//输入结束条件
break;
double ans=0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&cat[i].get,&cat[i].pay);
cat[i].ave=cat[i].get/cat[i].pay;
}
sort(cat,cat+n,cmp);
for(int i=0;i<n;i++)
if(m>=cat[i].pay)//够换
{
m-=cat[i].pay;
ans+=cat[i].get;
}
else//不够换
{
ans+=m*cat[i].ave;//按比例换
break;
}
printf("%.3lf\n",ans);
}
return 0;
}