2021-06-21:贩卖机只支持硬币支付,且收退都只支持10 ,50,100三种面额。一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用大钱的原则,需要购买的可乐数量是m, 其中手头拥有的10、50、100的数量分别为a、b、c,可乐的价格是x(x是10的倍数) 。请计算出需要投入硬币次数?

福大大 答案2021-06-21:

时间紧,思路见代码。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
m := 10
a := 20
b := 30
c := 40
x := 50
ret := putTimes(m, a, b, c, x)
fmt.Println(ret)
} // 正式的方法
// 要买的可乐数量,m
// 100元有a张
// 50元有b张
// 10元有c张
// 可乐单价x
func putTimes(m int, a int, b int, c int, x int) int {
// 0 1 2
qian := []int{100, 50, 10}
zhang := []int{c, b, a}
// 总共需要多少次投币
puts := 0
// 之前面值的钱还剩下多少总钱数
preQianRest := 0
// 之前面值的钱还剩下多少总张数
preQianZhang := 0
for i := 0; i < 3 && m != 0; i++ {
// 要用之前剩下的钱、当前面值的钱,共同买第一瓶可乐
// 之前的面值剩下多少钱,是preQianRest
// 之前的面值剩下多少张,是preQianZhang
// 之所以之前的面值会剩下来,一定是剩下的钱,一直攒不出一瓶可乐的单价
// 当前的面值付出一些钱+之前剩下的钱,此时有可能凑出一瓶可乐来
// 那么当前面值参与搞定第一瓶可乐,需要掏出多少张呢?就是curQianFirstBuyZhang
curQianFirstBuyZhang := (x - preQianRest + qian[i] - 1) / qian[i]
if zhang[i] >= curQianFirstBuyZhang { // 如果之前的钱和当前面值的钱,能凑出第一瓶可乐
// 凑出来了一瓶可乐也可能存在找钱的情况,
giveRest(qian, zhang, i+1, (preQianRest+qian[i]*curQianFirstBuyZhang)-x, 1)
puts += curQianFirstBuyZhang + preQianZhang
zhang[i] -= curQianFirstBuyZhang
m--
} else { // 如果之前的钱和当前面值的钱,不能凑出第一瓶可乐
preQianRest += qian[i] * zhang[i]
preQianZhang += zhang[i]
continue
}
// 凑出第一瓶可乐之后,当前的面值有可能能继续买更多的可乐
// 以下过程就是后续的可乐怎么用当前面值的钱来买
// 用当前面值的钱,买一瓶可乐需要几张
curQianBuyOneColaZhang := (x + qian[i] - 1) / qian[i]
// 用当前面值的钱,一共可以搞定几瓶可乐
curQianBuyColas := getMin(zhang[i]/curQianBuyOneColaZhang, m)
// 用当前面值的钱,每搞定一瓶可乐,收货机会吐出多少零钱
oneTimeRest := qian[i]*curQianBuyOneColaZhang - x
// 每次买一瓶可乐,吐出的找零总钱数是oneTimeRest
// 一共买的可乐数是curQianBuyColas,所以把零钱去提升后面几种面值的硬币数,
// 就是giveRest的含义
giveRest(qian, zhang, i+1, oneTimeRest, curQianBuyColas)
// 当前面值去搞定可乐这件事,一共投了几次币
puts += curQianBuyOneColaZhang * curQianBuyColas
// 还剩下多少瓶可乐需要去搞定,继续用后面的面值搞定去吧
m -= curQianBuyColas
// 当前面值可能剩下若干张,要参与到后续买可乐的过程中去,
// 所以要更新preQianRest和preQianZhang
zhang[i] -= curQianBuyOneColaZhang * curQianBuyColas
preQianRest = qian[i] * zhang[i]
preQianZhang = zhang[i]
}
if m == 0 {
return puts
} else {
return -1
} } func giveRest(qian []int, zhang []int, i int, oneTimeRest int, times int) {
for ; i < 3; i++ {
zhang[i] += (oneTimeRest / qian[i]) * times
oneTimeRest %= qian[i]
}
} func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2021-06-21:贩卖机只支持硬币支付,且收退都只支持10 ,50,100三种面额。一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用大钱的原则,需要购买的可乐数量是m, 其中手头拥有的10、50的更多相关文章

  1. 2021.06.21 onmouseover和onmouseleave事件对比

    在重新巩固js基础的过程中,分别使用onmouseover和onmouseleave事件却导致了不同的效果,但是在之前的记忆中,这两者确实是一样的哈,因此探究一下产生不同效果的原因. 在使用onmou ...

  2. [LeetCode] Lemonade Change 买柠檬找零

    At a lemonade stand, each lemonade costs $5.  Customers are standing in a queue to buy from you, and ...

  3. [Swift]LeetCode860. 柠檬水找零 | Lemonade Change

    At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...

  4. Leetcode860.Lemonade Change柠檬水找零

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  5. 【LeetCode】860. 柠檬水找零

    860. 柠檬水找零 知识点:贪心 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 ...

  6. Leetcode 860. 柠檬水找零

    860. 柠檬水找零  显示英文描述 我的提交返回竞赛   用户通过次数187 用户尝试次数211 通过次数195 提交次数437 题目难度Easy 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...

  7. LeetCode 860.柠檬水找零(C++)

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  8. LeetCode:柠檬水找零【860】

    LeetCode:柠檬水找零[860] 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向 ...

  9. C#LeetCode刷题之#860-柠檬水找零(Lemonade Change)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4036 访问. 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...

  10. [LeetCode] Coin Change 硬币找零

    You are given coins of different denominations and a total amount of money amount. Write a function ...

随机推荐

  1. celery介绍安装以及基本使用步骤

    目录 一.关于celery 二.celery架构的构成 1 任务中间件 Broker, 2 任务执行单元 worker 3 结果存储 backend 三.celery的应用场景 1. 异步执行:解决耗 ...

  2. mimikatz和procdump的密码抓取

    mimikatz mimikatz功能很强大,主要使用就是提取明文密码.哈希.PIN码和Kerberos凭证. 常用的只有两条命令: 注意:运行时使用管理员身份运行 privilege::debug ...

  3. 对利用jsp模板编写登录、注册界面的方法言

    使用模板的相关操作步骤详解 1.可以在相关的网站上面找相关的css或者js文件,下载到一个特定的文件夹里面,以备使用 2.然后,将存有相关代码的文件夹直接复制粘贴到web文件下,就会直接保存,可以根据 ...

  4. GO语言学习笔记-工具链篇 Study for Go ! Chapter eleven - Tool Chain

    持续更新 Go 语言学习进度中 ...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs ...

  5. 你可能需要的 6 个 React 开发小技巧

    ​ 这是一个可怕的问题,在React中,我们经常会编写条件语句来显示不同的视图,比如这个简单的例子. const App = () => { return ( <> { loadin ...

  6. day10-SpringBoot的异常处理

    SpringBoot异常处理 1.基本介绍 默认情况下,SpringBoot提供/error处理所有错误的映射,也就是说当出现错误时,SpringBoot底层会请求转发到/error这个映射路径所关联 ...

  7. SpringBoot——国际化

    更多内容,前往IT-BLOG 一.Spring 编写国际化时的步骤 [1]编写国际化配置文件:[2]使用 ResourceBundleMessageSource 管理国际化资源文件:[3]在页面使用 ...

  8. 【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系

    并发编程的难题和挑战 在并发编程的技术领域中,对于我们而言的难题主要有两个: 多线程之间如何进行通信和线程之间如何同步,通信是指线程之间以何种机制来交换信息. 多线程的线程通信机制 在命令式编程中,线 ...

  9. MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

    MySQL 中的索引 前言 索引的实现 哈希索引 全文索引 B+ 树索引 索引的分类 聚簇索引(clustered index) 非聚簇索引(non-clustered index) 联合索引 覆盖索 ...

  10. ChatGPT3.5使用体验

    优点 1.ChatGPT 能颠覆现有的搜索引擎(百度.谷歌). 2.ChatGPT 的交互体验非常好,满足"智能助手"这种工具. 3.如何使用好ChatCPT? 回到一个经典的问题 ...