IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 买矿泉水,空瓶,瓶盖,再兑换矿泉水类问题 -> 正文阅读

[数据结构与算法]买矿泉水,空瓶,瓶盖,再兑换矿泉水类问题

听到这个,是否有些感触?是否见过这一类的题目?

实际上这种题,并不困难......

看个例题叭:

你有十块钱,矿泉水两块钱一瓶,四个瓶盖换一瓶,两个空瓶换一瓶,你能买多少瓶矿泉水?

没错,短短几句话,实则一道深奥的数学题

这道题有许多解法,“通往罗马的路不止一条”

方程实现:

我们可以通过数学方程来解决这道题:

设使用空瓶兑换到的瓶数为X(整数)

设使用空瓶兑换到的瓶数为Y(整数)

则总瓶数为5+X+Y

可列出二元一次不等式组:

1、 设Y=1,由公式2求出则X={0,1},将X,Y带入公式1,不符合(舍去)

2、 设Y=2,由公式2求出则X={1,2,3,4},将X,Y带入公式1,不符合(舍去)

3、 设Y=3,由公式2求出则X={4,5,6,7},将X,Y带入公式1,求解X=7

所以一共喝了5+X+Y=5+3+7=15(瓶)

看,解决了!!!

但是......若是给你很多钱,或者直接给你原来有好多瓶,例如1000元,100000瓶,这再去列二元一次不等式组显然不太行得通......

所以,这就要用到更高级的算法,运用到C++代码操作

代码实现:

我们可以通过代码来实现计算:

为了程序更灵活,我们可以读入任意金额:

int a; //定义 
cin>>a; //输入有几元钱 
int b=a/2; //空瓶的数量
int c=b; //瓶盖的数量
int sum=b; //记录总共喝了几瓶

表示花光这些钱,可以得到a/2个空瓶,也就有a/2个瓶盖,喝了a/2瓶水,所有的量定义完了之后,我们就要想下面部分了

每次都有可能再兑换到水,这将会直接影响空瓶的数量以及瓶盖都数量

所以,这就要用到while循环

看看题目:四个瓶盖换一瓶,两个空瓶换一瓶

所以,只要b>=2或者c>=4,就会衍生出许多情况,故循环条件就是b>=2或者c>=4,然后再继续循环查看

while(b>=2||c>=4) //只要空瓶>=2或者瓶盖>=4,就可以再换,继续查看情况

继续查看,如果瓶盖大于4个,就会消耗4个瓶盖,再获得一瓶矿泉水,因此产生一个空瓶和一个瓶盖;如果空瓶大于2个,就会消耗2个空瓶,再获得一瓶矿泉水,因此产生一个空瓶和一个瓶盖

if(b>=2) //如果空瓶>=2
{
	b-=2; //换走两个空瓶
    sum++; //可以再喝一瓶
	c+=1; //换来一瓶得到一个瓶盖
	b+=1; //换来一瓶得到一个空瓶
}
if(c>=4) //如果瓶盖>=2
{
	c-=4; //换走四个瓶盖
    sum++; //可以再喝一瓶
	b+=1; //换来一瓶得到一个空瓶
	c+=1; //换来一瓶得到一个瓶盖
}

只要走到最后b>=2或者c>=4,意思就是还能换,就会再走一遍,直到两个条件都不成立,不能再换为止

最后只要输出sum,喝了几瓶就行啦

cout<<sum;

?完整代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a; //定义 
	cin>>a; //输入有几元钱 
	int b=a/2; //空瓶数量
	int c=b; //瓶盖数量
	int sum=b; //记录总共喝了几瓶
	while(b>=2||c>=4) //只要空瓶>=2或者瓶盖>=4,就可以再换 
	{
		if(b>=2) //如果空瓶>=2
		{
			b-=2; //换走两个空瓶
		    sum++; //可以再喝一瓶
			c+=1; //换来一瓶得到一个瓶盖
			b+=1; //换来一瓶得到一个空瓶
		}
		if(c>=4) //如果瓶盖>=2
		{
			c-=4; //换走四个瓶盖
		    sum++; //可以再喝一瓶
			b+=1; //换来一瓶得到一个空瓶
			c+=1; //换来一瓶得到一个瓶盖
		}
	}
	cout<<sum; //输出一共喝了几瓶
	return 0;
}

运行效果:

这样,这道例题就解决啦(若是直接给的瓶子数量,稍作修改即可,这里就不再赘述)

(当然,这是不存在“借”这个行为,否则另外讨论计算)

简便算法实现:

运用递推迭代算法:

喝的总瓶数m=4*初次瓶数k-5

这里的k再这道题就是b(a/2),即是买光钱所得到的瓶数

这么一看,是不是就特别easy?

至此,这一类问题你已经会做了,还有更多更巧妙的算法,就不再一一说明了

总结:

这是一道相对简单,贴近生活的一道数学逻辑题,运用方程,代码,算法.....都可以实现解答

补充:

其中有一个规律,即最后总会剩下3个瓶盖,1个空瓶

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:22:02  更:2022-01-03 16:22:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:42:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码