FatMouse'贸易(贪心算法)

题目:FatMouse准备了M磅的猫粮,准备与守卫包含他最喜欢的食物JavaBean的仓库的猫交易。 
仓库有N个房间。第i个房间包含J [i]磅的JavaBeans并且需要F [i]磅的猫粮。FatMouse不需要为房间里的所有JavaBeans进行交易,相反,如果他支付F [i] *%磅的猫粮,他可能会得到J磅的JavaBeans。这是一个实数。现在他正在为你分配这个功课:告诉他他可以获得的最大JavaBeans数量。 

input:输入包含多个测试用例。每个测试用例以包含两个非负整数M和N的行开始。然后是N行,每行包含两个非负整数J [i]和F [i]。最后一个测试用例后跟两个-1。所有整数不大于1000。 

output:对于每个测试用例,在一行中打印一个实数,最多精确到3个小数位,这是FatMouse可以获得的最大JavaBeans数量。 

题解:此题要求用M的东西去换每个房间中的东西,要求同一量的东西换的东西越多越好,而且换取东西时候可以分割。

代码实现:

#include <iostream>
#include<algorithm>
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct pp
{
    int j,f;         
    double ave;

} s[10000];
bool cmp(struct pp &p,struct pp &q)      
{
    return p.ave>q.ave;
}

int main()
{
    int i,m,n,k=0;
    double sum=0;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        sum=0;
        if(m==-1&&n==-1)
            break;
        for(i=0; i<n; i++)   
        {
            scanf("%d %d",&s[i].j,&s[i].f);  /*循环输入*/
            s[i].ave=(double)s[i].j/s[i].f;  /*求出一块猫粮换取目标食物的数量*/

        }
        sort(s,s+n,cmp);       /*按换取目标数量多少排序*/
        for(i=0; i<n; i++)
        {
            if(s[i].f<m)     /*如果换取第一个仓库里面目标数的总数要小于现在拥有的猫粮数,那么可 
                              以全额换取,补充:此时为什么不要加等于号,其实不是太重要,最多只 
                              会多一次的循环而已*/
            {
                sum+=s[i].j;
                m-=s[i].f;
            }
            else             
            {
                sum+=s[i].ave*m;   /*如果要小于或者等于仓库里面的目标数量,那么可以用自己剩余 
                    break;                的全部进行交换,然后跳出循环*/
            }
        }
        printf("%.3f\n",sum);
    }
    return 0;
}

刚接触C语言可能有些地方写的不是太好,请个位大佬见谅。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值