原创作品 转载请注明出http://blog.csdn.net/always2015/article/details/47747077
这一道题意思就是老鼠用猫食物换取自己最喜爱的食物javaBean的过程,当然换取的最终结果是保证最后的JavaBean是最多的,而且是当自己手中的猫食物小于每个仓库所需交换的猫食物时候,可以手中有多少就交换多少。所以在解这道题时候要想到按照每个仓库javaBean最大的比率排序才能保证最后的交换的javaBean是最大的。这是解决该题的关键思路。我的AC代码如下,注释都包含在代码中,希望对大家有所帮助:
#include <iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
//定义输入仓库的结构体
struct trade
{
int javaBean;//代表J
int cat_food;//代表F
double rate;//J和F的比率
};
/*
调用sort排序函数,,因为最后结果要求获得最大的javaBean,所以 按照J与F比值大小排序
比值相等则按照JavaBean大小排序
*/
bool bigger(trade a,trade b)
{
if(a.rate==b.rate)return a.javaBean>b.javaBean;
else return a.rate>b.rate;
}
int main(void)
{
int M,N,temp;
double total_javaBean=0.0;//最后的javaBean总数
trade *input_trade;
while(cin>>M>>N)
{
//M,N都为-1结束
if(M==-1&&N==-1)break;
input_trade=new trade[N];
//输入仓库情况
for(int i=0;i<N;i++)
{
cin>>input_trade[i].javaBean>>input_trade[i].cat_food;
input_trade[i].rate=(double)input_trade[i].javaBean/input_trade[i].cat_food;
}
//对各个仓库按照单位javaBean大小排序
sort(input_trade,input_trade+N,bigger);
temp=M;
for(int j=0;j<N;j++)
{ //剩下的猫食物比仓库所需的猫食物多时,JavaBean总数就直接相加,剩下的猫食物相应减少
if(temp>=input_trade[j].cat_food)
{
total_javaBean+=input_trade[j].javaBean;
temp-=input_trade[j].cat_food;
}else
{
//当剩下猫食物小于仓库所需的,那么就按照比例去取,然后直接跳出循环
total_javaBean+=((double)temp/input_trade[j].cat_food)*input_trade[j].javaBean;
break;
}
}
//格式输出
cout <<setiosflags(ios::fixed)<<setprecision(3)<<total_javaBean<< endl;
total_javaBean=0;
delete input_trade;
}
return 0;
}