链接:https://www.nowcoder.com/acm/contest/69/B
来源:牛客网

蜥蜴的生日快到了,就在这个月底!
今年,蜥蜴的快乐伙伴之一壁虎想要送好多个1元硬币来恶整蜥蜴。
壁虎身上目前有的硬币种类和数量如下:
c1个1元硬币、c5个5元硬币、c10个10元硬币、c50个50元硬币。
壁虎觉得只送c1个1元硬币不够慷慨,想拿一些币值较大的硬币去换更多的1元硬币,于是跑去找一台自动贩卖机,靠着买东西找零来获得更多1元硬币!
这台自动贩卖机的找零机制如下:
每件物品的价格都是v元(v为给定值),假设你投入的硬币总额是x元(x必须>=v),点选了一样物品后,贩卖机就会落下x-v元。
假设落下的硬币有d1个1元硬币、d5个5元硬币、d10个10元硬币、d50个50元硬币,贩卖机会选择d1+d5+d10+d50最小的方案找你钱,有办法证明这样的方案只有一种。(假设此自动贩卖机每种币值的硬币都有无穷多个。)
现在壁虎想知道,和这台自动贩卖机换钱后(假设壁虎心甘情愿地花巨量时间来买很多用不到的东西来恶整蜥蜴),最多能用多少1元硬币恶整蜥蜴?

输入描述:

输入的第一行有一个正整数T,代表询问数。
接下来有T行,每个询问各占1行,包含五个整数c.
分别代表壁虎有的1元、5元、10元、50元的硬币数目以及此自动贩卖机里一件物品的价格。

输出描述:

每个询问请输出一行包含一个整数,代表该询问的答案。
示例1

输入

2
2 0 1 0 3
0 0 0 1 10

输出

6
0

说明

在第一个询问中,你共有2个1元硬币和1个10元硬币,自动贩卖机中一个物品的价格为3元。
首先壁虎可以投一个10元硬币买一件物品,此时贩卖机会找壁虎1个5元和2个1元,之后壁虎再投一个5元买一件物品,贩卖机会再找壁虎2元,于是最后壁虎共有6个1元硬币。

备注:

1<=T<=10

[分析]:注释

[代码]:

#include<bits/stdc++.h>
using namespace std;
long long c1, c5, c10, c50, v;
int main(){
int _;
scanf("%d", &_);
while(_--){
scanf("%lld%lld%lld%lld%lld", &c1, &c5, &c10, &c50, &v);
c5 += c10 * + c50 * ; //总共有多少张5元
long long cnt = ceil(v * 1.0 / ); //买一个需要多少张5元
long long cg = cnt * - v; //找回的1元是多少
c1 += cg * (c5 / cnt); //能买c2/cnt个v
printf("%lld\n", c1);
}
return ;
}
/* 很容易可以看出10元所能找回的最大1元数和两张5元是一样的. 一个十元硬币等价于两个五元硬币,举个简单的例子:
有一个十元硬币,v=1,则用十元硬币买v,找回1个五元4个一元。
相当于用一个五元的硬币买了东西找回四元,还有剩下五元没用到,
再用这五元去买东西。如此则十元与两个五元是等效的。
*/

数学

#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int maxn = 1e5+;
LL a[],v;
int t;
int b[] = {,,,};
int main()
{
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld%lld",&a[],&a[],&a[],&a[],&v);
for(int i = ;i>=;i--){
LL cnt = (v-)/b[i]+;
LL cnt2 = a[i]/cnt;
if(cnt>a[i]) continue;
a[i] -= cnt2*cnt;
LL tmp = (LL)cnt*b[i]-v;
for(int j = i-;j>=;j--){
a[j] += tmp/b[j]*cnt2;
tmp = tmp-tmp/b[j]*b[j];
}
}
// cout<<"fuc"<<endl;
for(int i = ;i>=;i--){
// cout<<"fwfwgggg"<<endl;
LL tmp = a[i]*b[i];
LL need = v-tmp;
for(int j = i-;j>=;j--){
if(need>a[j]*b[j]){
tmp += a[j]*b[j];
need -= a[j]*b[j];
a[j] = ;
}
else{
LL tmp2 = (need-)/b[j]+;
a[j] -= tmp2;
need = ;
tmp += b[j]*tmp2;
LL tmp3 = tmp-v;
for(int k = i-;k>=;k--){
a[k] += tmp3/b[k];
tmp3 = tmp3-tmp3/b[k]*b[k];
}
}
if(need==){
break;
}
}
}
// cout<<"fwfwf"<<endl;
printf("%lld\n",a[]);
}
}

贪心模拟

Wannafly交流赛1 B 硬币[数学思维/贪心]的更多相关文章

  1. Wannafly交流赛1_B_硬币【数学】

    Wannafly交流赛1_B_硬币[数学] 链接:https://www.nowcoder.com/acm/contest/69/B 来源:牛客网 题目描述 蜥蜴的生日快到了,就在这个月底! 今年,蜥 ...

  2. Wannafly交流赛1 _A_有理数 【水】

    Wannafly交流赛1 A有理数 [水] 链接:https://www.nowcoder.com/acm/contest/69/A 来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到 ...

  3. Wannafly交流赛1(施工中)

    A.有理数 签到题:直接用floor函数就行了,详细看代码 #define debug #include<stdio.h> #include<math.h> #include& ...

  4. Wannafly交流赛1 A 有理数[模拟/分类讨论]

    链接:https://www.nowcoder.com/acm/contest/69/A来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到小于v的最大有理数. 但这个问题的答案对于任意 ...

  5. 记:青岛理工ACM交流赛筹备工作总结篇

    这几天筹备青岛理工ACM交流赛的过程中遇到了不少问题也涨了不少经验.对非常多事也有了和曾经不一样的看法, ​一直在想事后把这几天的流水帐记一遍,一直没空直到今天考完C++才坐下来開始动笔.将这几天的忙 ...

  6. 程序设计中的数学思维函数总结(代码以C#为例)

    最近以C#为例,学习了程序设计基础,其中涉及到一些数学思维,我们可以巧妙的将这些逻辑问题转换为代码,交给计算机运算. 现将经常会使用到的基础函数做一总结,供大家分享.自己备用. 1.判断一个数是否为奇 ...

  7. PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记

    PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...

  8. UVa10025 The ? 1 ? 2 ? ... ? n = k problem 数学思维+规律

    UVa10025 ? 1 ? 2 ? ... ? n = k problem The problem Given the following formula, one can set operator ...

  9. 青岛理工交流赛 H题 素数间隙

    13110581088注销 素数间隙 Time Limit: 1000MS Memory limit: 262144K 题目描述 Neko猫是一个很喜欢玩数字游戏的会说话的肥猫,经常会想到很多很好玩的 ...

随机推荐

  1. Mdrill集群安装

    Mdrill集群安装 mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目.旨在帮助用户在几秒到几十秒的时间内,分析百亿级别的任意维度组合的数据.mdrill是一个分布式的在 ...

  2. js武器库

    打造自己的 JavaScript 武器库 2017-12-14 SlaneYang JavaScript 自己打造一把趁手的武器,高效率完成前端业务代码. 前言 作为战斗在业务一线的前端,要想少加班, ...

  3. Spring MVC 使用 HttpServletResponseWrapper 修改返回结果

    HttpServletResponseWrapper 是什么? ServletResponse 的包装类,相关设计模式 装饰者模式. 运行环境 jdk 1.7 spring boot 整合的web环境 ...

  4. loj2073 「JSOI2016」扭动的回文串

    ref 主要是要理解"撑到"最长这个概念 (为啥我的代码这么长QAQ #include <iostream> #include <cstdio> using ...

  5. leetcode 【 Add Two Numbers 】 python 实现

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  6. MFC深入浅出读书笔记第三部分1

    第八章 Document-View 深入探讨(总结) 1.Document Document 在MFC 的CDocument 里头被具体化.CDocument 本身并无任何具体数据,它只是提供一个空壳 ...

  7. Python+Selenium练习篇之20-处理Alert弹窗

    本文来介绍如何通过Selenium方法去处理网页Alert弹窗,和处理iframe类似,都是通过switch_to方法.这里还是没有找到合适的alert弹窗网站,我们就自己创建一个吧,前面文章介绍了如 ...

  8. Python-S9—Day85-ORM项目实战之forms组件以及Modelform补充、跨域请求及应用

    01 forms组件补充1 02 forms组件补充2 03 ModelForm回顾 04 浏览器的历史 05 jsonop实现跨域请求 06 jsonop实现跨域请求2 07 jsonop实现跨域请 ...

  9. 用python批量下载贴吧图片 附源代码

    环境:windows 7 64位:python2.7:IDE pycharm2016.1 功能: 批量下载百度贴吧某吧某页的所有帖子中的所有图片 使用方法: 1.安装python2.7,安装re模块, ...

  10. linux VIM编辑器常用指令

    一般模式 查看文本-移动光标 [Ctrl] + [f] 屏幕『向前』移动一页 [Ctrl] + [b]  屏幕『向后』移动一页  n<space> 按下数字后再按空格键,光标会向右移动这一 ...