ACM程序设计书中题目--P(粮食问题)

题目简述:有n斤粮食,按照一定比例兑换。输入a表示第i个仓库有a斤粮食,输入b表示换a斤粮食需要b斤别的东西。

解题思路:

1、首先考虑既然是按照一定的比例进行交换,则首先对于输入的每组数,求出其对应的比例。储存这些数据自然想到用结构体进行储存。

2、按照每组的比例从高到低进行排序,先交换比例高的,换完再换下一个,别的东西不够了,就按照比例进行交换,最后结果保留三位数输出。

3、涉及到排序问题,所以考虑到用sort函数,用到sort函数就考虑用到vector,所以对于vector<类型>进行了更进一步的强化。

4、输入-1,-1即程序结束。

解题感想:通过这一道题,更加熟练了对于动态数组的使用,在以后的做题中会考虑到vector中的类型可以有很多,而不只局限于int ,char等类型,也可以是自定义的类型。同时也对于排序中自定义排序规则得到了多一次的锻炼。对于这样一道比较简单的题,收获也比较多。

源代码:

#include <bits/stdc++.h>
using namespace std;
struct FatMouse
{
    double a;
    double b;
    double c;
};
bool cmp(FatMouse a,FatMouse b)
        {
            if (a.c!=b.c)
            return a.c>b.c;
            else
            return a.b<b.b;
        }
int main()
{
    int N,M;
    FatMouse o;
    vector <FatMouse> d;
    while (cin>>M>>N)
    {
        if (M==-1&&N==-1)
        break;
        double sum=0;
        for (int i=0;i<N;i++)
        {
            cin>>o.a>>o.b;
            o.c=o.a/o.b;
            d.push_back(o);
        }
        sort (d.begin(),d.end(),cmp);
        for (int i=0;i<N;i++)
        {
            if (M>d[i].b)
            {
            M=M-d[i].b;
            sum=sum+d[i].a;
            }
            else
            {
            sum=sum+double(M)*d[i].c;
            break;
            }
        }
        cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl;
        d.clear();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值