杭电ACM 1009:FatMouse' Trade

原创作品 转载请注明出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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值