杭电1009(FatMouse' Trade)

FatMouse' Trade

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 51740    Accepted Submission(s): 17347


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
// 贪心,排序求最优解;
 1 #include<stdio.h>
 2 #include<algorithm> 
 3 using namespace std;
 4 struct d 
 5 {
 6     double m,n;
 7     double value;
 8 };
 9 
10 d sum[100000];
11 
12 bool cmp(d m,d n)
13 {
14     return m.value>n.value;
15 }
16 
17 int main()
18 {
19     int a,b;
20     while(~scanf("%d %d",&a,&b))
21     {
22         if(a==-1&&b==-1)
23         break;
24         int i;
25         double total=0,c=0;
26         for(i=0;i<b;i++)
27         {
28             scanf("%lf %lf",&sum[i].m,&sum[i].n);
29             sum[i].value=sum[i].m/sum[i].n;
30         }
31         
32         sort(sum,sum+b,cmp);
33         
34     /*    for(i=0;i<b;i++) //为什么注释掉的部分for循环结束后,不加if语句OJ就一直错,搞不懂;
35         {
36             a-=sum[i].n;
37             if(a>=0)
38             total+=sum[i].m;
39             else
40             break;
41         }*/
42         for(i=0;i<b;i++)
43         {
44             if(a>sum[i].n)
45             {
46                 total+=sum[i].m;
47                 a-=sum[i].n;
48             }
49             else
50             {
51                 c=1;
52                 total+=a*sum[i].value;
53             }
54             if(c!=0)
55             break;
56         }
57         /*if(a<0)
58         total+=(a+sum[i].n)*sum[i].value; 
59         */printf("%.3lf\n",total);
60     }
61     return 0;
62 }

 

 

你可能感兴趣的:(杭电)