Description
FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.
The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.
Input
The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers J[i] and F[i] respectively. The last test case is followed by two -1's. All integers are not greater than 1000.
Output
For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.
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
这道题的基本题意为FatMouse手中有M的猫食,他可以去N个房间中换食物,每个房间有一定的食物,并且知道
换取这些食物需要多少猫食,要求计算M的猫食最多能换取多少食物。
基本思路为设置一个结构体用来存储没个房间的换食物比例及房间中的食物多少,然后按比例从大到小给结构体排序,然后从前到后挨着换取食物,知道把猫食全部用完。
源代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,m,n,x,y;
double d;
struct
{
int a;
int b;
double c;
}s[1005],S;
multimap<double,int>v;
multimap<double,int>::reverse_iterator t;
while(cin>>m>>n&&m!=-1&&n!=-1)
{ for(i=0;i<n;++i)
{ cin>>x>>y;
d=(double)x/y;
s[i].a=x;
s[i].b=y;
s[i].c=d;
}
for(i=0;i<n-1;++i)
for(j=i+1;j<n;++j)
if(s[i].c<s[j].c)
{ S=s[i];
s[i]=s[j];
s[j]=S;
}
for(d=0,i=0;m>0&&i<n;++i)
{ if(m>=s[i].b)
{ m-=s[i].b;
d+=s[i].a;
}
else
{ d+=s[i].c*m;
m-=s[i].b;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(3)<<d<<endl;
v.clear();
}
}
需要注意的地方在于猫食快换完时不够下个房间所需要的猫食时需要特别考虑。