洛谷链接

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

首先,这是一道贪心题

我的大致方法: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. 提高服务端性能的几个socket选项

    提高服务端性能的几个socket选项 在之前的一篇文章中,作者在配置了SO_REUSEPORT选项之后,使得应用的性能提高了数十倍.现在介绍socket选项中如下几个可以提升服务端性能的选项: SO_ ...

  2. [LeetCode]367. Valid Perfect Square判断完全平方数

    方法有很多,我觉得比较容易记住的是两个,一个是二分法,在1-num/2中寻找目标数 另一个是数学方法: public boolean isPerfectSquare(int num) { /* 有很多 ...

  3. 嵌入式LInux-让开发板访问外网-ping bad address baidu.com

    我的嵌入式设备已经接入网络.能够ping局域网ip.可是为了实现能够ping通外网.比如 ping baidu.com 还是不行的. 当运行ping baidu.com这个命令时,提示 ping ba ...

  4. C语言输入字符串

    首先强调一点,C语言没有字符串的概念!所谓的字符串实际上还是以数组形式保存的. 方法1  -- 通过"%s"输入 优点:简单明了,输入字符只要不大于数组长度都可以. #includ ...

  5. C语言全排列

    #include <stdio.h> int m=5; char s[]="12345"; void Swap(char *a, char *b)//元素交换 { ch ...

  6. 在 ASP.NET Core和Worker Service中使用Quartz.Net

    现在有了一个官方包Quartz.Extensions.Hosting实现使用Quartz.Net运行后台任务,所以把Quartz.Net添加到ASP.NET Core或Worker Service要简 ...

  7. Spring事务管理?

    事务管理方式: 1.编码方案,不建议使用,具有侵入性,在原有的业务代码基础上去添加事物管理代码 2.声明式事务控制,基于AOP对目标进行代理,不具有侵入性,不需要修改原来的业务代码

  8. 【分布式锁】Redis实现可重入的分布式锁

    一.前言 之前写的一篇文章<细说分布式锁>介绍了分布式锁的三种实现方式,但是Redis实现分布式锁关于Lua脚本实现.自定义分布式锁注解以及需要注意的问题都没描述.本文就是详细说明如何利用 ...

  9. 一文彻底吃透MyBatis源码!!

    写在前面 随着互联网的发展,越来越多的公司摒弃了Hibernate,而选择拥抱了MyBatis.而且,很多大厂在面试的时候喜欢问MyBatis底层的原理和源码实现.总之,MyBatis几乎成为了Jav ...

  10. spark的 structStreaming 一些介绍

    转发 https://www.toutiao.com/a6696339998905467403/?tt_from=mobile_qq&utm_campaign=client_share& ...