题意:
      有n种硬币,每种硬币有mi个,然后让你给奶牛发工资,每周发至少c元(就是不找零钱的意思)然后问你能发几周?(硬币之间都是倍数关系)

思路:
      这个题目做了两天,丢脸,看完这个题目我的第一反应就是从大的发起,就是先花面值大的,能大的就一直大的,只要不超过c,然后再能小的就一直小的,补全没超过但是又不够那一部分,这个想法一开始就是对的,只不过我写的时候是排序,然后从前往后取,不能取了再从后往前取。。。这样一直wa,后来无奈了 我看了下题解,卧槽,没错啊(这最蛋疼了,因为我敲题的错误思路和正确思路没冲突,说不清..)结果就一直以为自己姿势不对,然后不停的重新敲,优化优化优化。。还是wa,最后无奈了,直接找了个代码看看,结果...哎!  说下正解吧、

#include<stdio.h>
#include<string.h>
#include<algorithm>using namespace std;typedef struct
{int a ,b;
}NODE;NODE node[25];bool camp(NODE a, NODE b)
{return a.a > b.a;
}int minn(int x ,int y)
{return x < y ? x : y;
}int main ()
{int n ,c ,i ,j;int need[25];while(~scanf("%d %d" ,&n ,&c)){for(i = 1 ;i <= n ;i ++)scanf("%d %d" ,&node[i].a ,&node[i].b);sort(node + 1 ,node + n + 1 ,camp);int ans = 0 ,l;for(i = 1 ;i <= n ;i ++)if(node[i].a >= c) ans += node[i].b;else break;if(i == n + 1){printf("%d\n" ,ans);continue;}l = i;while(1){memset(need ,0 ,sizeof(need));int s = c;for(i = l ;i <= n ;i ++){need[i] = minn(node[i].b ,s / node[i].a);s -= need[i] * node[i].a;}if(s > 0)for(i = n ;i >= l ;i --){if(node[i].b && node[i].a >= s){s -= node[i].a;need[i] ++;break;}}if(s > 0) break;int t = 1000000000;for(i = l ;i <= n ;i ++){if(need[i])t = minn(t ,node[i].b / need[i]);}ans += t;for(i = l ;i <= n ;i ++)if(need[i]) node[i].b -= t * need[i];}printf("%d\n" ,ans);}return 0;
}

其实这个题目是个不错的贪心题,这个题目我们一定要注意,大硬币一定是小硬币的倍数,这个是关键,首先我们把所有硬币按照面值从大到小排序,比c还大的面值想都不用想,直接就加上硬币个数,然后处理其他的,我们先从大的取,能取多少取多少,就是比如你要取50块钱,然后现在有

面值  30   15   1
                个数   2    5   4
这样先取的个数是       1    1   4   一共是 30*1+15*1+1*4=49
剩余个数 1 4 0  距离目标还差1块钱,然后我们在倒着取
1 15 30
0  4  1

在15的地方取一个,然后满足要求了,就行了,这样做是为了保证超出c的部分的钱是最少的,正确性的前提是 硬币之间的倍数关系,还有就是存在优化,就是同样的一次可以同时开出好几周的工资,这个在写的时候自己去想吧,还有这个题目要明确一个问题,就是硬币之间没有什么关系,就是每个硬币只要保证尽量浪费的少就行了。    



POJ3040给奶牛发工资相关推荐

  1. 10 号发工资和 20 号发工资的公司,区别竟然这么大?

    来源 | 南京本地宝 工资的话题 一直占据着职场热度榜单 这不 最近又热起来了 10号发工资和20号发工资, 就能看出一个公司是否靠谱? 对很多工薪族来说 发工资这一天 是脱贫致富的重要日子 也是很多 ...

  2. 又一个创业者自杀:心生郁结,被曝曾卖房给员工发工资

    创业之路到底有多艰难,竟让许多创业者最后走向轻生之路? 2019年12月底,在即将进入新年之际,网传山西好车容易创始人闫宝才于12月26日下午,在家中服用头孢等药物及白酒自杀,后被紧急送往附近医院抢救 ...

  3. 5号发工资和25号发工资,真能看出公司是否靠谱?

    来源 | 网络 5号发工资和25号发工资,就能看出一个公司是否靠谱? 对很多工薪族来说,发工资这一天基本上是脱贫致富的重要日子,也是很多人的还款日子,交房租,还信用卡--想到接下来的日子又得靠拆东墙补 ...

  4. HDU2021 发工资咯

    Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处 ...

  5. HDU_oj_2021 发工资喽

    Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处 ...

  6. hdu 2021 发工资咯:)(c语言)

    hdu 2021 发工资咯:) 点击做题网站链接 题目描述 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  7. 【Java7】练习:选角色,挑苹果,员工类,换心脏,斗地主,发工资,客户信息管理软件,开发团队调度系统

    文章目录 1.玩家选择角色:return new 2.人工挑苹果:只一个接口CompareAble 3.员工类接口:implements Comparator 4. 医生帮换心脏:Organ类doWo ...

  8. HDOJ2021 ( 发工资咯:) ) 【水题】

    Problem : 2021 ( 发工资咯:) )     Judge Status : Accepted RunId : 6000664    Language : C    Author : qq ...

  9. C++描述杭电OJ 2021.发工资 ||

    C++描述杭电OJ 2021.发工资 || Problem Description 财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的 ...

最新文章

  1. 教遗传算法人工智能玩超级马里奥大陆
  2. 学习新技能时,大脑在如何发生改变?
  3. 测试一个config server 服务器挂机后,集群是否能读写数据
  4. 用户操作-用户详情服务器端代码实现
  5. 计算机网络 课后题答案解析,计算机网络课后习题和答案解析
  6. group by多字段分组
  7. 简单Android app开发_什么方法开发APP最简单?试试0代码开发平台
  8. 用户故事与敏捷方法—编写故事
  9. 基于SSM开发的的小区物业管理系统小程序源码
  10. linux 添加udp端口映射,iptables下udp端口转发
  11. 团队协作工具-版本控制软件SVN、Git、码云
  12. 客户成功服务市场现状研究分析报告 -
  13. tomcat发布网站的三种方式
  14. 图解《狂飙》人物关系
  15. [solved] login to server failed: EOF
  16. 安科瑞电气火灾监控系统对分散在建筑内的探测器进行遥测、遥调、遥控、遥信,方便实现监控与管理。
  17. 拉格朗日方法求最优解
  18. c语言黑色星期五 代码,C语言 黑色星期五的问题
  19. 小米笔记本触摸屏“失灵”
  20. mysql备份的三种方案(冷备、温备、热备)

热门文章

  1. Android Studio的git功能的使用
  2. linux工作常用软件
  3. Android开发环境简单配置
  4. golang-china
  5. 基于silverlight4(beta)的摄像头应用(Beta2)发布
  6. gstreamer开发日志
  7. 刷题向》关于一道比较优秀的递推型DP(openjudge9275)(EASY+)
  8. ajax-典型应用-验证用户名
  9. 动态可订制属性的 PropertyGrid(转载)
  10. java虚拟机6.HotSpot的GC实现