Greedy Mouse
时间限制:1000 ms | 内存限制:65535 KB
难度: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
-
贪心题目,但是WA了好几次,后来看别人的代码,发现别人把剩余的最后的那部分m也放在了for循环里,后来改了改AC了
-
#include<iostream> #include<iomanip> #include<stdio.h> #include<ios> #include<algorithm> using namespace std; struct mouse{ double x,y,z; }a[1000]; bool cmp(mouse m,mouse n){ return m.z>n.z; } int main() { int n; double m; while(cin>>m>>n){ if(m==-1&&n==-1) return 0; for(int i =0;i!=n;i ++){ cin>>a[i].x>>a[i].y; a[i].z=a[i].x/a[i].y; } sort(a,a+n,cmp); double sum=0; int j=0; for(int j=0;j!=n;j++){ if(m>a[j].y){ sum+=a[j].x ; m-=a[j].y ; }else{ sum+=(m*a[j].z ); break; } } cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl; } return 0; }