洛谷 P2376 [USACO09OCT]津贴Allowance 解题报告
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:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const ll N=23;
const ll inf=0x3f3f3f3f3f3f3f3f;
pair <ll ,ll > money[N];
ll n,c,now,ans,cnt[N],l,r;
int main()
{
scanf("%lld%lld",&n,&c);
for(ll i=1;i<=n;i++)
scanf("%lld%lld",&money[i].first,&money[i].second);
sort(money+1,money+1+n);
l=1,r=n;
while(233)
{
memset(cnt,0,sizeof(cnt));
now=c;
for(ll i=r;i>=l;i--)
{
if(!now) break;
if(now>=money[i].first)
{
cnt[i]=now/money[i].first;
if(cnt[i]<=money[i].second)
now=now%money[i].first;
else
{
cnt[i]=money[i].second;
now=now-money[i].first*cnt[i];
}
}
}
if(now)
{
ll L=l;
while(now)
{
if(now<=money[L].first*(money[L].second-cnt[L]))
{
cnt[L]+=now/money[L].first+(now%money[L].first?1:0);
if(!money[L].second) L++;
now=0;
}
else
{
now-=money[L].first*(money[L].second-cnt[L]);
cnt[L]=money[L].second;
L++;
}
if(L>r) break;
}
}
if(!now)
{
ll cntt=inf;
for(ll i=l;i<=r;i++)
if(cnt[i])
cntt=min(cntt,money[i].second/cnt[i]);
ans+=cntt;
for(ll i=l;i<=r;i++)
{
money[i].second-=cntt*cnt[i];
if(!money[l].second) l++;
}
while(r>=l&&!money[r].second) r--;
}
else
break;
}
printf("%lld\n",ans);
return 0;
}
2018.7.1
洛谷 P2376 [USACO09OCT]津贴Allowance 解题报告的更多相关文章
- 洛谷 P2376 [USACO09OCT]津贴Allowance
https://www.luogu.org/problemnew/show/P2376 看了题解做的,根本不会贪心.. #include<cstdio> #include<algor ...
- P2376 [USACO09OCT]津贴Allowance
P2376 [USACO09OCT]津贴Allowance一开始想的是多重背包,但是实践不了.实际是贪心,让多c尽可能少,所以先放大的,最后让小的来弥补. #include<iostream&g ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
随机推荐
- Android 下拉刷新上拉加载PullToRefresh
https://github.com/823546371/PullToRefresh http://www.jianshu.com/p/0f5d0991efdc
- Luogu P3227 [HNOI2013]切糕
%%ZZKdalao上课讲的题目,才知道网络流的这种玄学建模 我们先想一想,如果没有D的限制,那么想当于再每一根纵轴上选一个权值最小的点再加起来 我们对应在网络流上就是每一根纵轴上的点向它下方的点用权 ...
- PostgreSQL杂记页
磨砺技术珠矶,践行数据之道,追求卓越价值 luckyjackgao@gmail.com 返回顶级页:PostgreSQL索引页 此页,记录其他数据库,linux以及各种点滴事项 1--数据库设计 1 ...
- 汇编 XOR运算
XOR运算 按位异或^ 一.按位异或^ 运算符^ 1^1=0;0^0=0; //相同则为0 0^1=1;1^0=1; //不相同为1 1101^0110=1011; // asm_XOR.c ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- 用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作
C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3 ...
- 巧用ios朗读kindle图书
想必大家都有想过kindle出中文的有声阅读刊物吧? 今天突发奇想想到一招能够让我们听自己拿kindle买的中文图书.当然这是有条件的. 前提是你得有一个ios设备,不管是iphone还是ipad,i ...
- JavaScript快速入门-ECMAScript本地对象(Array)
Array对象 Array对象和python里面的list对象一样,是用来存储多个对象值的对象,且方法和属性基本上类似. 一.属性 lenght 二.方法 1.concat() 用于连接两个或多个 ...
- 软件测试_测试工具_LoadRunner
最近正在逐步学习软件测试工具的使用,此文章也是用来当做笔记以供记录之用.如有问题,还请多多指出. 安装LoadRunner基本步骤从网上搜索即可找到,特此提供部分链接参考(其中附带软件下载): 1.L ...
- Scrapyd+Gerapy部署Scrapy爬虫进行可视化管理
Scrapy是一个流行的爬虫框架,利用Scrapyd,可以将其部署在远程服务端运行,并通过命令对爬虫进行管理,而Gerapy为我们提供了精美的UI,可以在web页面上直接点击操作,管理部署在scrap ...