洛谷链接

这个题翻译忘了输入,我看的英语原文......

首先,这是一道贪心题

我的大致方法: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的更多相关文章

  1. 【codeforces 761C】Dasha and Password(动态规划做法)

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 题解报告:hdu 2069 Coin Change(暴力orDP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...

  3. CF1256A Payment Without Change 题解

    OI生涯打的第一场CF比赛,写篇题解纪念一下吧 ------------可以想到先尽量用面值为1的硬币来凑,然后再用面值为n的硬币来补足.先算出用上所有面值为1的硬币还差多少钱,然后判断用面值为n的硬 ...

  4. LeetCode题解之Lemonade Change

    1.题目描述 2.问题分析 使用贪心算法. 3.代码 class Solution { public: bool lemonadeChange(vector<int>& bills ...

  5. UVALive 7503 Change(乱搞)题解

    题意:你现在有面额为A的纸币,现在需要面额为B的钱(可以是一张也可以是好多张拼成一张),有一台自动售货机,里面有任意价格的商品,售货机兑换出的零钱是随机的(比如找你0.03可能给你0.01+0.01+ ...

  6. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  7. QTREE系列题解

    打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...

  8. Contest2037 - CSU Monthly 2013 Oct(中南大学2013年10月月赛水题部分题解)

    Problem A: Small change 题解:http://www.cnblogs.com/crazyapple/p/3349469.html Problem B: Scoop water 题 ...

  9. 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划

    题目链接 : http://acm.xidian.edu.cn/land/problem/detail?problem_id=1006 Description wm最近喜欢上一种无聊的转盘解锁游戏,他 ...

随机推荐

  1. Tomcat启动web项目静态页面中文乱码问题解决

    1 首先查看静态页面在编辑器中是否正常,  如果是eclipse ,需要设置一下项目编码格式为utf-8, 如果是idea , 一般会自动识别, 也可以自己手动检查一下, 检查html上面是否有    ...

  2. 学习 Gin 问题总结 2020.12.29

    学习 Gin 问题总结 2020.12.29 数据绑定与解析 BindXXX,ShouldBindXXX和ShouldBindWith区别 BindXXX 会自动返回信息,输入无效时,在header写 ...

  3. JavaSwing 船只停靠管理可视化(二)

    JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...

  4. MVC和WebApi路由机制比较

    1.MVC使用的路由 在MVC中,默认路由机制是通过解析url路径来匹配Action.比如:/User/GetList,这个url就表示匹配User控制器下的GetList方法,这是MVC路由的默认解 ...

  5. tail常用命令总结

    tail命令作用: tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到 ...

  6. Spring Cloud Hystrix原理篇(十一)

    一.Hystrix处理流程 Hystrix流程图如下: Hystrix整个工作流如下: 构造一个 HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在 ...

  7. java实现发送短信验证码

    java实现短信验证码发送 由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册. 在这里我选择是秒嘀科技,因为新人注册会赠送十元,足够测试使用了. 注册完成后,我们需要获取自己 ...

  8. i5 11300H 怎么样 相当于什么水平

    i5-11300H 为 4 核 8 线程,主频 3.1GHz,睿频 4.4GHz,三级缓存 8MBi5-11300H 怎么样看完你就知道了 https://list.jd.com/list.html?

  9. maven打包时排除配置文件

    上网查了一下,直接在pom里面配置就好了,具体写法如下所示 <build> ... <resources> <resource> <directory> ...

  10. 图像质量评估论文 | Deep-IQA | IEEETIP2018

    主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, gr ...