题目描述:
有一只老鼠很喜欢奶酪,但是奶酪被分别放在N个房间里,而且这些房间都有一只猫咪看守,现在它准备和猫咪们做个交易。它有M磅的猫食,想用这M磅猫食换取奶酪。在猫咪看守的每一个房间里有奶酪J[i]磅,同时猫咪需要F[i]磅的食物,如果老师给猫咪F[i]*a%的猫食,那么它就可以得到J[i]*a%的奶酪。现在已知每只猫咪对猫食的需求量和每个房间的奶酪数,那老鼠怎样才能换得最多的奶酪呢?
Input:
第一行输入参数M和N,后面跟N行(每个房间的奶酪数和猫食的需求量)。在输入M和N为-1和-1时程序终止。
Output:
分行输出老鼠得到的最多的奶酪数,保留三位小数。
样例输入: 样例输出:
5 3 13.3333 7 2 31.5000 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1
思路:
首先思考如何交出一磅猫粮换回最多的奶酪,这里用j[i]/f[i]即在每个房间交换后获得的数量,例如第一个样例:第一个房间一磅猫粮能换7/2,第二个房间能换4/3,第三个房间能换5/2。比较可知在最佳交换顺序为一三二,接着判断每次交换后m(猫粮剩余)的数量,当m<小于该房间猫所需的猫粮数,则退出循环。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int m,n;//m为猫粮数,n为房间数
while(cin>>m>>n&&m!=-1&&n!=-1)
{
double a[100],b[100];
double sum=0;
double aver[100]={0};//存放每个房间的平均值
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
aver[i]+=a[i]/b[i];
}
while(m){
double max=0;
int key=0;
for(int j=0;j<n;j++){
if(max<aver[j]) {
max=aver[j];
key=j;//找到最佳的房间下标
}
}
if(m>=b[key]){
sum+=a[key];
m=m-b[key];
aver[key]=0;//将以交换的房间置空
}//如果现有的猫粮大于该房间所需的猫粮数,直接将该房间所有奶酪换走
else if(m<b[key])
{
sum+=m*aver[key];
break;
}//如果现有的猫粮小于该房间所需猫粮数,将剩余猫粮交换即可
}
printf("%.3lf\n",sum);
}
return 0;
}
第一次写文章,思路和代码仅供参考,希望各位大佬提出宝贵的意见!