HDUOJ-1009 FatMouse' Trade(贪心)

采用贪心的思考问题方法

即“做出的是在某种意义上的局部最优解”,对于本题来说,局部最优解就是整体最优解,因此采用贪心法。

解题结构

· 一个结构体来存储每个房间的状态以及性价比

· 调用C++的algorithm库的 sort( LengthFirstAddress , LengthFirstAddress+Length , Compare ) 函数来进行排序,如果没有Compare则默认从小到大排序

· Compare结构为bool Compare(Type a,Type b){ return a>b; }
(a > b为降序,a < b为升序,Type为a,b的数据类型)

解题核心

状态1:老鼠剩余的猫粮可以完全买下性价比最高的房子的豆子,那么买下,并更新自己持有的猫粮数,统计买到手的豆子

状态2:剩余的猫粮不足以买下性价比最高的房子的豆子,那么按百分比来买,并更新自己持有的猫粮数,统计买到手的豆子
,(此时已经没”钱”了,结束判断,输出结果)

Accept代码

/*
* Created by zsdostar in 2016/4/30
*/
#include <iostream>
#include<algorithm>
using namespace std;
struct greedheart
{
  double value;
  double JavaBean;
  double CatFood;
};
bool compare(greedheart room1,greedheart room2)
{
  return room1.value>room2.value;
}
int main()
{
  int m,n;
  struct greedheart room[10010];
  while((cin>>m>>n)&&(m!=-1)&&(n!=-1))
  {
      double thentotal=m;
      double sum=0;
      for(int i=0;i<n;i++)
      {
          cin>> room[i].JavaBean >> room[i].CatFood;
          room[i].value = room[i].JavaBean / room[i].CatFood;
      }
      sort(room,room+n,compare);
      for(int i=0;i<n;i++)
      {
          if(thentotal < room[i].CatFood)
          {
            sum += (thentotal/room[i].CatFood)*room[i].JavaBean;
            thentotal -= room[i].CatFood;
            break;
          }
          else if(thentotal >= room[i].CatFood)
          {
              sum += room[i].JavaBean;
              thentotal -= room[i].CatFood;
          }
      }
      printf("%.3lf\n",sum);
  }
}

(感觉英文才是ACM最大的难点。。看了TinyJian的翻译才看明白题意。。)
(TinyJian的博客:http://blog.csdn.net/TinyJian/article/details/48738693

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值