HDU - 1009 简单贪心


HDU - 1009的题目链接

(一)大意

这个题其实不难,但英语看的着实令人难受。博主大概来翻译一下,大概就是给你m磅的猫粮,有n个房子,每个房子呢,都有若干的javabeans。每个房子的猫粮与javabeans的兑换比率不同,(比如数据给你的是7 2,代表2磅猫粮可以换7磅javabeans。所以我们希望 j[i] /f[i]的比率越大越好)你要做的就是尽可能把手中的猫粮换成更多的javabeans。

(二)思路

思路很简单啊,考虑到每个房子的猫粮与javabeans的兑换比率不同。我们只要优先去兑换比率高的房子即可,即用少的猫粮去兑换多的javabeans。我们只需要计算每个房子中猫粮与javabeans的兑换率,再来个排序。这样就能实现,优先每次去的是兑换比率最高的房子,这样,我们手中的猫粮,就能换到最多的javabeans

(三)代码

#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <string>
#include <iostream>

using namespace std;
const int maxn = 1000;
const int inf=0x3f3f3f3f;
struct Node
{
   double j,f,price; //price是性价比,性价比高代表能用猫粮换更多的javabeans
};
bool cmp(Node a,Node b)
{
    return a.price>b.price; 
     //把房子按性价比从高到底排列,这样我们优先进入兑换性价比高的房子
}
int main()
{
       double sum,m;  
    // m是我们手中的猫粮数量,要设为double ,sum为我们得到的javabeans的数量
       int n;
       while(scanf("%lf%d",&m,&n)!=EOF)
       {
           sum=0;
           if(m==-1&&n==-1) break;
           Node fatmouse[maxn];
           for(int i=0;i<n;i++)
           {
               scanf("%lf%lf",&fatmouse[i].j,&fatmouse[i].f);
               fatmouse[i].price=fatmouse[i].j/fatmouse[i].f; //计算每一个房子的兑换率
           }
           sort(fatmouse,fatmouse+n,cmp); 
           for(int i=0;i<n&&m;i++)  
           //已经遍及完所有的房子,或者手中猫粮已经兑换完则跳出循环。
           {
               if(m>=fatmouse[i].f) //如果手中的猫粮比这个房子所有猫粮要多
               {
                   m-=fatmouse[i].f; //全部把房子里面的猫粮换成javabeans
                   sum+=fatmouse[i].j; 
               }
               else
               {
                   sum+= fatmouse[i].price*m; 
                   //当手中猫粮不足时,就把手里的猫粮全部兑换成的javabeans
                   m=0;
               }
           }
           printf("%.3f\n",sum);
       }
    return 0;
}


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值