Greedy Mouse
-
描述
-
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
上传者
思路:翻译:胖老鼠准备英镑的猫粮,准备与猫的贸易保护仓库包含他最喜欢的食物:花生。仓库有N个房间。第i个房间containsW[我]磅的花生,需要F[我]磅的猫粮。Fatmouse不必对所有房间里的花生贸易,相反,他可能会得到W[我]* %磅的花生如果他支付F[我]* %磅的猫粮。鼠标是一个愚蠢的鼠标,所以你能告诉他可以获得最大的花生。
”先把性价比高的保住,嗯,就是这样的“ 耗子如是说=-=
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<cmath> using namespace std; struct mouse { int w,f; double rate; }p[1005]; int cmp(mouse a,mouse b) { return a.rate>=b.rate; } int main() { int m,n; while(scanf("%d%d",&m,&n)) { if(m==-1&&n==-1) break; for(int i=0;i<n;i++) { scanf("%d%d",&p[i].w,&p[i].f); p[i].rate=p[i].w*1.0/p[i].f; } sort(p,p+n,cmp); // for(int i=0;i<n;i++) // { // printf("%d %d %lf\n",p[i].w,p[i].f,p[i].rate); // } double sum=0; for(int i=0;m>0&&i<n;i++) { if(p[i].f<=m) { sum+=p[i].w; m-=p[i].f; } else { sum += m*p[i].rate; // cout<<"**"<<p[i].rate<<endl;; break; } } printf("%.3lf\n",sum); } }