【题解】 CF767E Change-free
这个题翻译忘了输入,我看的英语原文......
首先,这是一道贪心题
我的大致方法:pair+堆优
题目分析:
从第一天开始,到最后一天,每天可以选择找钱或者不找钱.
如果不找钱,则零钱数m减去多出的零钱;
如果找钱,则食堂大爷的怒气值上升找钱数乘每天心情值w。(下文称ann值)
贪心策略:
既然这样,我们就可以利用贪心思想
有两种情况:
情况一:
如果手中的零钱数是足够的,就选择用手中的零钱支付所需要的零钱;
情况二:
如果手中的零钱数不够,就找出之前用零钱支付多余钱数的一天,让时间回溯,在那一天选择用100元支付零钱,让大爷找钱。
这样就多出了100元的零钱,足以支付当前所需支付的零钱,但收银员的怒气值会上升,需要专门记录下来(只不过大爷更生气了而已......)
Q: 选哪一天呢?
A:还用想吗?当然是使大爷怒气值上升最小的那一天,也就是在之前经过的天数中选择ann值的最小值。
贪心正确证明:
反证法:
如果在需要零钱时(也就是手中零钱不足以支付多余钱数),选择非最小的ann值,那我们将在可以支付当前多余钱数的情况下,收银员的怒气值上升比最小ann值所上升的怒气值要高,不符合最优方案,故错误。
(同样结果却使收银员怒气值更高,非最优方案)
结论:
不能选用非最小ann值
结论成立,贪心方案正确
优化:
我想到这里,噼里啪啦地打完了代码,满怀信心地提交
结果:

我:??????
我:!!!!!!
好吧,看来得优化
我冥思苦想(这次没看题解),想到既然是求动态最小值,那用堆优找ann值
可以用pair类型把之前经过的天的ann值和第几天存下
于是我打上去一个堆优,结果样例二又过不去了
我就这样改了一遍又一遍,总算样例都过了~
提交上去,果然看到了一片绿~~
注意:
1、记得开long long
(m的最大值为一的九次方,若叠加几次可能会爆int(也可能不会爆))
我不会算
2、用100元能够正好支付时不加入堆中
题目中不允许多给钱,如果用100元正好支付完就无法来换零钱,故不加入堆中
3、若用pair类型存储数据,要将ann值放在pair中的first
pair类型排序时默认用first来排序
PS:
堆中存的是可能需要让收银员找钱的天数
一开始经过的天数(没有让收银员找零)都可能是需要让收银员找钱的天数,故放进堆中
若出现情况二,就利用堆找到ann最小值,完成找钱操作并使已找过钱的天数被pop,避免题目中多给钱的情况
完整AC代码:
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#define MAXN 100001#define LL long long#define M(i, j) make_pair(i, j)using namespace std;
LL c[MAXN], w[MAXN], zheng[MAXN], ling[MAXN];//zheng[i]是第i天100元花费的个数,ling[i]是第i天零钱花费的元数LL n, m, h, k, ans=0;int vis[MAXN];priority_queue<pair<LL, LL>, vector< pair<LL, LL> >, greater< pair<LL, LL> > > q;//小头堆(STL万岁!)
int main(){
scanf("%lld %lld", &n, &m); for (int i = 1; i <= n; i++){ scanf("%lld", &c[i]); zheng[i] = c[i] / 100;//算出每天至少花费多少100元 c[i] %= 100;//预处理,c[i]只存需花费零钱 } for (int i = 1; i <= n; i++) scanf("%lld", &w[i]); for (int i = 1; i <= n; i++){ ling[i] += c[i];//题目中不允许多给钱,如果用100元正好支付完就无法来换零钱 if (c[i]) q.push(M(w[i]*(100 - c[i]), i));//用pair类型将天数与大爷可能上升的怒气值存进堆里(pair类型默认用first来排序) if (c[i] > m){ h = q.top().first;//取出最小怒气值 k = q.top().second;//取出是哪一天 q.pop(); vis[k] = 1;//标记这一天已经换了零钱了(这句好像没用) ans += h;//积累怒气值 ling[k] -= c[k];//那一天不用找零了 zheng[k]++;//那一天100元整数+1 m += 100;//多出100元零钱 } m -= c[i]; } printf("%lld\n", ans); for (int i = 1; i <= n; i++){ printf("%lld %lld\n", zheng[i], ling[i]); } return 0;}
希望能帮到您~~⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄.
【题解】 CF767E Change-free的更多相关文章
- 【codeforces 761C】Dasha and Password(动态规划做法)
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 题解报告:hdu 2069 Coin Change(暴力orDP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...
- CF1256A Payment Without Change 题解
OI生涯打的第一场CF比赛,写篇题解纪念一下吧 ------------可以想到先尽量用面值为1的硬币来凑,然后再用面值为n的硬币来补足.先算出用上所有面值为1的硬币还差多少钱,然后判断用面值为n的硬 ...
- LeetCode题解之Lemonade Change
1.题目描述 2.问题分析 使用贪心算法. 3.代码 class Solution { public: bool lemonadeChange(vector<int>& bills ...
- UVALive 7503 Change(乱搞)题解
题意:你现在有面额为A的纸币,现在需要面额为B的钱(可以是一张也可以是好多张拼成一张),有一台自动售货机,里面有任意价格的商品,售货机兑换出的零钱是随机的(比如找你0.03可能给你0.01+0.01+ ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- QTREE系列题解
打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...
- Contest2037 - CSU Monthly 2013 Oct(中南大学2013年10月月赛水题部分题解)
Problem A: Small change 题解:http://www.cnblogs.com/crazyapple/p/3349469.html Problem B: Scoop water 题 ...
- 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划
题目链接 : http://acm.xidian.edu.cn/land/problem/detail?problem_id=1006 Description wm最近喜欢上一种无聊的转盘解锁游戏,他 ...
随机推荐
- [leetcode]29. Divide Two Integers不用除法实现除法
思路是不断将被除数分为两部分,每次分的一部分都是尽量大的除数的倍数,然后最后的商就是倍数加上剩下的部分再分,知道不够大. 递归实现 剩下的难点就是,正负号(判断商正负后将两个数都取绝对值),数太大(将 ...
- 风炫安全web安全学习第三十节课 命令执行&代码执行基础
风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...
- PyCharm 2019、2020、2021专业版激活
PyCharm下载地址:https://www.jetbrains.com/pycharm/download/ PyCharm社区版功能基本够用,但是作为傲娇的程序员,咱都是上来就专业版,然后各种破解 ...
- Synchronized 精讲
1.简介 1.1 作用 在并发场景中,保证同一时刻只有一个线程对有并发隐患的代码进行操作 1.2 错误案例 需求:两个线程对 count 变量进行200000次循环增加,预期结果是400000次 pu ...
- 面试官:你真的了解Redis分布式锁吗?
什么是分布式锁 说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程.性能高的特点,它还经常被用于做分布式锁. 锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同 ...
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- 在JavaScript种遇到这样的错误如何解决XML 解析错误:格式不佳 位置:http:/... 行 27,列 32:
相信很多人在开发的过程中都会遇到在js中解析xml文档的问题.有时候文档解析失败,但就是不知道怎么失败的,哪里格式不对.这里教大家一个方法来排查JavaScript解析xml文档格式出错的办法. 1. ...
- 软碟通制作win10镜像,无法打开install.wim的问题
打开软碟通,单击左上角"文件"→"打开",选择.iso文件的存放目录,再选择.iso映像文件打开,即可看到映像文件全部加载到UltraISO了,如下图. 将 ...
- ASP.NET Core错误处理中间件[2]: 开发者异常页面
<呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...
- buuctf—web—Easy Calc
启动靶机,查看网页源码,发现关键字 $("#content").val() 是什么意思: 获取id为content的HTML标签元素的值,是JQuery, ("# ...