杭电 1009 FatMouse' Trade (贪心)

时间:2023-03-10 06:26:53
杭电 1009 FatMouse' Trade (贪心)

Problem 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

题目大意:

老鼠有M磅猫食。有N个房间,每个房间前有一只猫,房间里有老鼠最喜欢的食品JavaBean,J[i]。若要引开猫,必须付出相应的猫食F[i]。当然这只老鼠没必要每次都付出所有的F[i]。若它付出F[i]的a%,则得到J[i]的a%。求老鼠能吃到的做多的JavaBean。

 #include<cstdio>
#include<algorithm>
using namespace std;
struct stu
{
double a,b; //不用float
}a[];
bool cmp(stu a,stu b)
{
return (a.a/a.b)>(b.a/b.b);
}
int main()
{
int m,n,i,j;
double sum;
while(scanf("%d %d",&m,&n)&&(m!=-)&&(n!=-))
{
sum=;
for(i=; i < n; i++)
{
scanf("%lf %lf",&a[i].a,&a[i].b);
}
sort(a,a+n,cmp);
for(i=;i<n;i++)
{
if(m > a[i].b)
{
sum+=a[i].a;
m-=a[i].b;
}
else
{
sum+=((m/a[i].b)*a[i].a);
break;
}
}
printf("%.3lf\n",sum);
}
}