P2376 [USACO09OCT]津贴Allowance

题目描述

作为创造产奶纪录的回报,\(Farmer\) \(John\)决定开始每个星期给\(Bessie\)一点零花钱。

\(FJ\)有一些硬币,一共有\(N(1<=N<=20)\)种不同的面额。每一个面额都能整除所有比它大的面额。

他想用给定的硬币的集合,每个星期至少给\(Bessie\)某个零花钱的数目\(C(1<=C<=100000000)\)。请帮他计算他最多能支付多少个星期的零花钱。

输入输出格式

输入格式:

第1行: 两个由空格隔开的整数:\(N\)和\(C\);

第2到第\(N+1\)行: 每一行有两个整数表示一个面额的硬币:硬币面额\(V(1<=V<=100,000,000)\)拥有的该面额的硬币数\(B(1<=B<=1,000,000)\)。

输出格式:

第1行: 一个单独的整数,表示最多能给支付多少个星期至少为\(C\)的零用钱。


一开始的贪心很容易想到要每次先给大钱,如果不够一步步拿小钱补充。

但最后小钱用完了可能产生浪费,万一大钱浪费一下可以更少呢。又看了看数据范围\(N(1<=N<=20)\),心想怕不是个搜索。憋了一会儿搜索写不出来。最后看了题解才知道是贪心。

先说说这个题贪心的思维导向性在哪,没错就是这句话“每一个面额都能整除所有比它大的面额”,是不是感觉又奇怪又违和,感觉用不上??

一般来讲,遇到这种看起来比较怪的条件,可以尝试这向贪心的方面想一想。哪怕证不出来也没关系,骗点分总不亏撒


下面正题,贪心策略及证明

策略

每一次给钱时,从大钱开始给,但每次给到要浪费钱的一次就不给了,用小一些的钱给。

给到已经没有小钱了以后,再给怎么也会产生浪费,就从小到大给,用面值尽可能小的钱产生浪费

总结起来就是一句话:当需要产生浪费时,用面值尽可能小的钱产生

证明

命题:大钱产生的浪费一定不比小钱小

证明:

任取两个面值的钱分别为\(ka,a\),\(k\)是正整数,在当前次还需要支付零用钱至少\(X\)

(1) 当浪费大钱\(ka\)时

设\(X=b*ka+r\)①

则浪费的钱数为\(f=ka-r\)②

(2)当浪费小钱\(a\)时

用掉一定的\(ka\)却不浪费当前次还需要支付的零用钱为\(X'=r\)

设\(X'=b'*a+r'\)③

则浪费的钱数为\(f'=a-r'\)④

两者做差,\(f-f'=(k-1)*a+r'-r\)

由③得,\(r'-r=-b'*a\)

则\(f-f'=(k-b'-1)*a\)

因为\(k,b'\)均为正整数且\(k>b'\),所以\(f-f'>=0\)

命题得证。


当然,我们肯定不能一次次的枚举每一周,否则会\(T\)两组。

考虑对情况进行加速,说是加速,其实也就是存储每周在某种情况下每个钱用了多少张,然后直接统计这种用钱情况可以重复多少次而已。

写的时候注意细节啊


Code:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define ll long long
  6. using namespace std;
  7. const ll N=23;
  8. const ll inf=0x3f3f3f3f3f3f3f3f;
  9. pair <ll ,ll > money[N];
  10. ll n,c,now,ans,cnt[N],l,r;
  11. int main()
  12. {
  13. scanf("%lld%lld",&n,&c);
  14. for(ll i=1;i<=n;i++)
  15. scanf("%lld%lld",&money[i].first,&money[i].second);
  16. sort(money+1,money+1+n);
  17. l=1,r=n;
  18. while(233)
  19. {
  20. memset(cnt,0,sizeof(cnt));
  21. now=c;
  22. for(ll i=r;i>=l;i--)
  23. {
  24. if(!now) break;
  25. if(now>=money[i].first)
  26. {
  27. cnt[i]=now/money[i].first;
  28. if(cnt[i]<=money[i].second)
  29. now=now%money[i].first;
  30. else
  31. {
  32. cnt[i]=money[i].second;
  33. now=now-money[i].first*cnt[i];
  34. }
  35. }
  36. }
  37. if(now)
  38. {
  39. ll L=l;
  40. while(now)
  41. {
  42. if(now<=money[L].first*(money[L].second-cnt[L]))
  43. {
  44. cnt[L]+=now/money[L].first+(now%money[L].first?1:0);
  45. if(!money[L].second) L++;
  46. now=0;
  47. }
  48. else
  49. {
  50. now-=money[L].first*(money[L].second-cnt[L]);
  51. cnt[L]=money[L].second;
  52. L++;
  53. }
  54. if(L>r) break;
  55. }
  56. }
  57. if(!now)
  58. {
  59. ll cntt=inf;
  60. for(ll i=l;i<=r;i++)
  61. if(cnt[i])
  62. cntt=min(cntt,money[i].second/cnt[i]);
  63. ans+=cntt;
  64. for(ll i=l;i<=r;i++)
  65. {
  66. money[i].second-=cntt*cnt[i];
  67. if(!money[l].second) l++;
  68. }
  69. while(r>=l&&!money[r].second) r--;
  70. }
  71. else
  72. break;
  73. }
  74. printf("%lld\n",ans);
  75. return 0;
  76. }

2018.7.1

洛谷 P2376 [USACO09OCT]津贴Allowance 解题报告的更多相关文章

  1. 洛谷 P2376 [USACO09OCT]津贴Allowance

    https://www.luogu.org/problemnew/show/P2376 看了题解做的,根本不会贪心.. #include<cstdio> #include<algor ...

  2. P2376 [USACO09OCT]津贴Allowance

    P2376 [USACO09OCT]津贴Allowance一开始想的是多重背包,但是实践不了.实际是贪心,让多c尽可能少,所以先放大的,最后让小的来弥补. #include<iostream&g ...

  3. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  4. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  5. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  6. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  7. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  8. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  9. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

随机推荐

  1. 5213 Exp3 免杀原理与实践

    5213 Exp3 免杀原理与实践 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧 使用msf编码器 ...

  2. 2017-2018-4 20155317《网络对抗技术》EXP3 免杀原理与实践

    2017-2018-4 20155317<网络对抗技术>EXP3 免杀原理与实践 一.问题回答 (1)杀软是如何检测出恶意代码的?杀软是通过代码特征比对得出的,将检查的代码和自己的特征库的 ...

  3. 2017-2018-1 20155320 嵌入式C语言——时钟

    2017-2018-1 20155320 嵌入式C语言--时钟 要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清 ...

  4. 20155330 《网络对抗》 Exp9 web安全基础实践

    20155330 <网络对抗> Exp9 web安全基础实践 实验问题回答 SQL注入攻击原理,如何防御 原理:SQL注入攻击值得是通过构建特殊的输入作为参数传入web应用程序,而这些输入 ...

  5. MiZ702学习笔记9——XADC采集片上数据PS版

    这次借助zynq的内嵌的XADC来采集zynq内部的一些参数: •VCCINT:内部PL核心电压 •VCCAUX:辅助PL电压 •VREFP:XADC正参考电压 •VREFN:XADC负参考电压 •V ...

  6. 配置yum,nc,telnet

    一.学习中问题 最近学习在学习Hadoop的一个子项目Zookeeper,在测试其中的“四字命令”---”echo ruok|nc localhost 2181“时发现命令无法被识别,如下图所示: [ ...

  7. Dynamics CRM2016 导入数据格式之xlsx的应用

    在CRM中导入数据中新增加了一个xlsx格式,这个在之前的版本(2013中没有,2015不清楚是否有)中是没有的 本篇的目的就是为了提醒各位,不要把这个格式和csv的导入功能混淆,因为xlsx格式的用 ...

  8. jvm系列(九):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  9. ElasticSearch入门 第五篇:使用C#查询文档

    这是ElasticSearch 2.4 版本系列的第五篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  10. nova状态同步

    服务初始化阶段 nova-compute服务启动时调用manager中的host初始化函数 self.manager.init_host() 在host初始化函数中完成如下操作: #初始化libvir ...