Greedy Mouse
1000 ms | 内存限制: 65535
3
A fat mouse prepared M pounds of cat food,ready to trade with the cats guarding the warehouse containing his
favorite food:peanut. The warehouse has N rooms.The ith room containsW[i] pounds of peanut and requires
F[i] pounds of cat food. Fatmouse does not have to trade for all the peanut in the room,instead,he may get
W[i]*a% pounds of peanut if he pays F[i]*a% pounds of cat food.The mouse is a stupid mouse,so can you tell
him the maximum amount of peanut he can obtain.
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 W[i] and F[i] respectively. The test case is terminated by two -1. All integers are not greater than 1000.
输出
For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of penaut that FatMouse can obtain.
样例输入
5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1
样例输出
13.333 31.500
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
double w;
double f;
}waho;
waho s[10001];
int comp ( const void *a, const void *b )
{
return ((*( waho * )a).w / (*(waho *)a).f ) >
((*( waho * )b).w/ (*(waho *)b).f ) ? -1:1 ;
}
void mxpea(waho wh[],int n,double m) //贪心选择 w/f最大者
{
int i;
double res=0;
double tem;
for (i=0;i<n;i++)
{
if (m>wh[i].f)
{
res+=wh[i].w;
m-=wh[i].f;
}
else
{
tem=m/wh[i].f;
res+=wh[i].w*tem;
break;
}
}
printf("%.3lf\n",res);
}
int main()
{
double m;
int n;
while(scanf("%lf%d",&m,&n) && m!=-1&&n!=-1)
{
int i;
for(i=0;i<n;i++)
scanf("%lf%lf",&s[i].w,&s[i].f);
qsort(s,n,sizeof(s[0]),comp);
printf("\n");
mxpea(s,n,m);
}
system("pause");
return 0;
}