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
N个仓库 M磅猫粮 交换东西 要么按要求把仓库需要的猫粮给仓库,然后把仓库的东西都收起来 ,要么按比例给猫粮换东西
分析:
就是找商最大的 ,按从大到小排列,如果有他所需要的猫粮就全部交换,没有则按剩余的比上所需要的猫粮这个比例换的东西
代码:
#include<bits/stdc++.h>
using namespace std;
struct cat{
double a,b,c;
bool operator<(const cat h)const{
return c>h.c;
}
};
int main()
{
multiset<cat>v;
multiset<cat>::iterator it;
double n,m,i,s,l;
cat h;
while(cin>>m>>n&&(n!=-1||m!=-1))
{
l=m;
s=0;
for(i=0;i<n;i++)
{
cin>>h.a>>h.b;
h.c=h.a/h.b;
v.insert(h);
}
for(it=v.begin();it!=v.end();it++)
{
if(l>=it->b){
s+=it->a;
l-=(*it).b;
}
else
{
s+=l/(*it).b*(*it).a;
break;
}
}
cout<<fixed<<setprecision(3)<<s<<endl;
v.clear();
}
}
感受:
这个题做的时间比较长 主要耽误在每次循环时没有把需要的数据清0,或者用集合的时候没有把集合里原来的东西清理干净, 导致影响后面的数据