用猫粮换豆子,有M磅的猫粮与N个的可以换豆子的房间。每个房间都有各自的兑换方式和豆子储量。因为在每个房间,都可以只兑换该房间豆子总量的一部分,因此自然先去汇率最高的房间兑换,如果全部兑换完这个房间的豆子还有猫粮剩余,就去剩下的房间中汇率最高的房间接着兑换;如果猫粮不足以兑换完这个房间的豆子,或者全部兑换完豆子正好耗尽猫粮,自然就是能兑换多少兑多少,然后停止交易。因此在执行这一流程前,根据汇率大小将所有房间进行排序。
#include <iostream>
#include <algorithm>
using namespace std;
struct bean
{
double j,f;
}b[1005];
int cmp(bean a,bean b)
{
return a.j/a.f > b.j/b.f;
}
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n)&&m>=0)
{
double sum=0;
for(int i=0;i<n;i++)
scanf("%lf%lf",&b[i].j,&b[i].f);
sort(b,b+n,cmp);
for(int i=0;i<n;i++)
{
if(m>b[i].f)
{
sum+=b[i].j;
m-=b[i].f;
}
else
{
sum+=(m/b[i].f)*b[i].j;
break;
}
}
printf("%.3f\n",sum);
}
return 0;
}