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 Ji pounds of JavaBeans and requires Fi pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get Ji* a% pounds of JavaBeans if he pays Fi* 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.
The warehouse has N rooms. The i-th room contains Ji pounds of JavaBeans and requires Fi pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get Ji* a% pounds of JavaBeans if he pays Fi* 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.
5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
13.333 31.500
这道题基本的意思是:
先输入两个数,第一个代表猫粮的数量,第二个代表房间对的数量,接下来输入各个房间豆子的数量以及对应需要的猫粮数,根据豆子数与猫粮数的比值大小计算总共能换取多少豆子。
c++:
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
struct tt
{
double a; //candy
int b; //number
double c; //chance
}z[1010];
bool compare(tt a,tt b)
{
return a.c>b.c;
}
int main()
{
//ios::sync_with_stdio("pause");
int m,n;
while(cin >> m >> n)
{
double s1=0;
if(m==-1&&n==-1)
{
break;
}
// tt *z=new tt[n];
for(int i=0;i<n;++i)
{
cin >> z[i].a >> z[i].b;
z[i].c=z[i].a/z[i].b;
//cout << z[i].c << endl;;
}
sort(z,z+n,compare);
for(int i=0;i<n;++i)
{
if(m>z[i].b)
{
m-=z[i].b;
s1+=z[i].a;
}
else
{
s1+=z[i].c*m;
break;
}
// cout << "df" << s << endl;
}
cout.setf(ios::fixed);
cout << setprecision(3) << s1 << endl;
}
return 0;
}
本文介绍了一种通过比较不同房间中Java豆与猫粮的交换比率来最大化获取Java豆数量的算法。该算法首先读取猫粮总量及房间数,然后接收每个房间的Java豆和所需猫粮的具体数值,通过计算各房间的交换比率并排序,最终确定最优的交换方案。
356

被折叠的 条评论
为什么被折叠?



