文章目录

  • 一、题目解读
    • 1、原题
    • 2、分类
    • 3、题意
    • 4、输入输出格式
    • 5、数据范围
  • 二、题解参考
    • 1、总体思路
    • 2、思路①
      • (1).分析
      • (2).一些数据
      • (3).AC代码
  • 三、评价与后话
    • 1、评价
    • 2、G++的坑
    • 3、后话

一、题目解读

1、原题

HDU.1009 FatMouse’ Trade

2、分类

  • 贪心
  • 背包——多重背包

3、题意

老鼠有MMM个猫币,猫有鼠币NNN堆(每堆数量为JiJ_iJi​)、并为每一堆提供了111种兑换比率Ji:FiJ_i:F_iJi​:Fi​(用FiF_iFi​个猫币可以换来JiJ_iJi​个鼠币),试问老鼠最多能用MMM个猫币换回多少鼠币?

再进一步简化,既然猫的鼠币是可以部分兑换的,那么我们只要给NNN种兑换比率对性价比进行排序,然后从性价比高的到低的一直到兑换结束就可以了。那么原问题就等价于在问,排列性价比JiFi\frac{J_i}{F_i}Fi​Ji​​,然后据此计算收获。

4、输入输出格式

输入/输出 要求与格式
输入样例个数 通过输入M=−1M=-1M=−1、N=−1N=-1N=−1标识输入结束
输入格式(每个样例) 第一行输入两个数MMM、NNN,后NNN行(空格隔开)每行输入两个数JiJ_iJi​、FiF_iFi​(空格分开)
输出格式(每个样例) 每行输出一个结果
输出精度 保留小数点后333位

5、数据范围

数据 范围
一切输入ttt 0≤t<10000 \leq t < 10000≤t<1000

二、题解参考

1、总体思路

思路 时间复杂度 具体解释
STL——sort O(nlog⁡n)O(n \log n)O(nlogn) 排完序尽量按照大的性价比兑换

2、思路①

(1).分析

在输入的时候,将免费兑换的直接统计到结果中,然后将不是免费的数据添加到数据列表中。

对非免费的数据列表根据性价比进行排序,这里就用STL里的sort函数就行了,可以重载小于运算符,也可以自定义函数然后传入sort作为参数。

排完序后开启循环进行兑换,从性价比大的开始兑换(res += ???),直到所有猫能提供的所有物资都被兑换完(cnt_t == cnt)或者老鼠的本金全部消耗完毕(fabs(left) < 1e-6)。

最后打印计算结果。

(2).一些数据

  • 坑爹数据1——免费兑换

    2 1
    1 0输出结果:1.000
    
  • 坑爹数据2——没有本金
    0 1
    1 1输出结果:0.000
    
  • 坑爹数据3——免费兑换+没有本金
    0 3
    1 0
    2 0
    1 1输出结果:3.000
    
  • 其他数据
    5 4
    2 2
    1 1
    0 0
    0 0输出结果:3.000
    

(3).AC代码

HDU(C++)AC代码如下:

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>using namespace std;struct node
{int get;int price;bool operator<(const node& n1)const{return double(get) / price > double(n1.get) / n1.price;}
}us[1005];int main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int M, N;int cnt;double res;int g, p;while (cin >> M >> N, M != -1 || N != -1){cnt = 0;res = 0;for (int i = 0; i < N; ++i){cin >> g >> p;if (p == 0){res += g;continue;}us[cnt].get = g;us[cnt].price = p;++cnt;}sort(us, us + cnt);int cnt_t = 0;double left = M;while (fabs(left) > 1e-6 && cnt_t < cnt){double real_get = min(double(us[cnt_t].get), double(left) * us[cnt_t].get / us[cnt_t].price);double real_price = min(double(us[cnt_t].price), left);res += real_get;left -= real_price;++cnt_t;}cout << fixed << setprecision(3) << res << endl;}return 0;
}

HDU(G++)AC代码如下:

#include <cstdio>
#include <algorithm>
#include <cmath>using namespace std;struct node
{int get;int price;bool operator<(const node& n1)const{return double(get) / price > double(n1.get) / n1.price;}
}us[1005];int main()
{int M, N;int cnt;double res;int g, p;while (scanf("%d %d", &M, &N), M != -1 || N != -1){cnt = 0;res = 0;for (int i = 0; i < N; ++i){scanf("%d %d", &g, &p);if (p == 0){res += g;continue;}us[cnt].get = g;us[cnt].price = p;++cnt;}sort(us, us + cnt);int cnt_t = 0;double left = M;while (fabs(left) > 1e-6 && cnt_t < cnt){double real_get = min(double(us[cnt_t].get), double(left) * us[cnt_t].get / us[cnt_t].price);double real_price = min(double(us[cnt_t].price), left);res += real_get;left -= real_price;++cnt_t;}printf("%.3lf\n", res);}return 0;
}

三、评价与后话

1、评价

这道题应该是贪心算法里一道比较简单的题目,但是有些情况往往容易被忽略,因此以后遇到一些题目开始的时候或者AC不了的时候,就要去想想有没有什么刁钻的数据。

2、G++的坑

真的很迷啊,一开始提交代码以后,C++成功AC了,G++依然WA.

根据以往的经验来看,G++总是容不下下面这句提高cincout效率的代码

ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

尤其是遇到字符串带空格输入的时候,G++编译器几乎100%出问题。

果不其然,把之前代码里cincout全部换成相应的scanfprintf之后,G++就也AC了(同样的代码C++自然也能AC)。

看来要求稳的话,以后还是少用cincout,多用scanfprintf吧……

3、后话

这道题,我也是大意了,今天一路WA将近10次,况且一看到这道题目的时候,就有很明显的去年暑假做过的印象,而且印象中当时不到1小时就写完AC了,半年后的今天居然画上将近2小时时间,看来刷题是不能止步了,或许1天1道题都远远不够……

还记得当年高二时候教我数学的张老师说过

“许多题目,你会做,是因为你做过”

现在我也想补充一下

“许多题目,你知道怎么做,是因为你做过;你能很快做对,是因为你做多了”

平时多练练吧。没有足够的经验累积,如何应付新题?没有熟练的老题套路,如何腾出时间应付其余题目?

HDU.1009 FatMouse' Trade相关推荐

  1. Java编写胖老鼠的交易,猫鼠交易(贪心) HDU 1009 FatMouse' Trade

    猫鼠交易(贪心) HDU 1009 FatMouse' Trade FatMouse prepared M pounds of cat food, ready to trade with the ca ...

  2. HDU 1009 FatMouse' Trade(简单贪心 物品可分割的背包问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1009 FatMouse' Trade Time Limit: 2000/1000 MS (Java/O ...

  3. HDU 1009 FatMouse' Trade肥老鼠的交易(AC代码) 贪心法

    题意: 一只老鼠用猫粮来换豆子,每个房间的兑换率不同,所以得尽量从兑换率高的房间先兑换.肥老鼠准备M磅猫粮去跟猫交易,让猫在warehouse中帮他指路,以找到好吃的.warehouse有N个房间,第 ...

  4. HDU 1009 FatMouse' Trade

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009 大意:老鼠准备了M磅猫食,准备拿这些猫食跟猫交换自己喜欢的食物.有N个房间,每个房间里面都有食物 ...

  5. HDU 1009 - FatMouse' Trade (部分背包问题)

    题目: 肥鼠准备了 M 磅的猫粮,准备和看管仓库的猫交易,仓库里装有他最喜爱的食物 Java 豆. 仓库有 N 个房间.第 i 间房包含了 J[i] 磅的 Java 豆,需要 F[i] 磅的猫粮.肥鼠 ...

  6. 杭电OJ——ACM 1009.FatMouse‘ Trade

    FatMouse'Trade 杭电OJ--ACM 1009.FatMouse' Trade链接入口 问题描述        肥老鼠换东西,m磅猫食,n间房子,每个房间有J[i]磅JavaBean,对应 ...

  7. HDU 1009 FatMouse

    贪心,求性价比排序一个个去换就好了,WA了一次,没有考虑猫粮过剩的情况 #include<stdio.h> int main() {int n;double m;while (1){int ...

  8. 【HDOJ】1009 FatMouse' Trade_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1009 [报告] 粗一看题目,哇,SF了,部分背包,贪心! 然后一交,满心期待AC,结果悲剧的WA了. 百 ...

  9. 【1009】FatMouse‘ Trade

    [1009]FatMouse' Trade 题目地址 贪心 FatMouse准备了M磅猫粮,准备和守卫仓库的猫咪交易,仓库里有他最喜欢的食物JavaBean. 仓库有N个房间.第i个房间里有J[i]磅 ...

最新文章

  1. 资讯|WebRTC M98 更新
  2. win7 ghost 纯净版最新系统下载
  3. 好久没发胡说八道的贴了,今天发一贴
  4. 485. Max Consecutive Ones - LeetCode
  5. springboot细节挖掘(jar和war打包)
  6. 保密作战--在网络上隐藏自己
  7. 【微信公众号开发】根据openId群发消息
  8. 如何设计一个本地缓存,涨姿势了!
  9. php mysql占位符_php中的占位符
  10. Java项目:宠物店管理系统(java+JSP+JavaScript+Bootstrap+Mysql)
  11. ODBC连接数据库实例
  12. 什么是GMSK调制-高斯最小移位键控
  13. 学习Vue电商后台管理系统剩余功能模块的bug
  14. 习题:求1-n的阶乘之和,用一个非递归函数fac(n)求n!,n的值由主函数输入,最终得到的结果在主函数中输出。
  15. 【金猿产品展】北森一体化人才管理云平台:让中国企业拥有世界领先的人才管理能力...
  16. 使用极光推送发送短信验证码
  17. NOIP 2010 普及组 三国游戏
  18. 验证码_python
  19. windows程序设计(一)
  20. 如何申请TexturePacker

热门文章

  1. 帆软finereport决策系统自定义登录界面
  2. java内存漏洞_处理Java程序中的内存漏洞
  3. string 方法 java_String 的几个 方法。 (java)
  4. 一个人就一个人——读书笔记
  5. 图片太大_图片太大?手把手教你如何用java实现一个高质量图片压缩程序
  6. 算法导论 思考题6-3(Young氏矩阵)
  7. 数据结构实验 寻找数组主元素(2013考研题)
  8. Java实验8 T5.使用键盘控制界面上图片的移动
  9. Vivado设计流程(二)设计文件输入
  10. YOLOX: Exceeding YOLO Series in 2021 --- Study Notes