题解-倒水问题

【基础】倒水 c++ 在一个桌子上摆放了n个杯子,每个杯子中有一定量的水。小A同学负责向杯子中倒水,他总共倒了k次,每次会向从第L个杯子到第R个杯子中添加P毫升的水(注意:水只可能增加,不可能减少)。存储的是第i个杯子相对于第i-1个杯子多出的水量。数组,累加水量变化,得到每个杯子最终的水量。共一行,包含n个整数,表示最终n个杯子每个杯子有多少毫升的水。请问小A同学倒了k次水之后,n个杯子每个杯子有多少毫升的水。的值表示从第1个杯子到第i个杯子之间总共增加的水量。数组用于存储每个杯子最初的水量,存储的就是第i个杯子最终的水量。 阅读详情

题目样解

题目背景
输入输出已更改,请不要直接提交原先的代码。
题目描述
假定两个水壶A和B,供水量不限。可以使用三种方法装水:

给一个水壶装水;
把一个水壶倒空;
从一个水壶倒进另一个水壶。
当从一个水壶倒进另一个水壶时,如果第一个水壶倒空,或者第二个水壶装满就不能再倒了。例如,一个水壶A是5加仑和另一个水壶B是6加仑,水量是8加仑,则从水壶A倒进水壶B时,让水壶B充满水而水壶A剩3加仑水。
问题由3个参数:C_a,C_b 和N,分别表示水壶A和B的容量,目标水量N。解决问题的目标是,给出一系列倒水的步骤,使水壶B中的水量恰好是N。

输入输出格式
输入格式:
第一行为数据组数T。

接下来的TT行,每行三个数字C_aC,C_b和N,意义如题目所示。T不超过30300<C_a≤Cb,N≤C_b≤1000C_a和C_b互质。

输出格式:
输出共为T行,第一个数字为要达成的完成次数a_i (题目保证存在解)。

接下来a_i个数字,表示各种操作:

1操作:fill A意为给A灌满水
2操作:fill B
3操作:empty A意为将A中水倒空
4操作:empty B
5操作:pour B A意为将B中水倒到A中(直到A满或者B中水没有剩余)
6操作:pour A B
输入输出样例
输入样例#1:
2
3 5 4
5 7 3
输出样例#1:
6 2 5 3 5 2 5
6 1 6 1 6 4 6
输入样例#2:
1
26 29 11
输出样例#2:
22 1 6 1 6 4 6 1 6 4 6 1 6 4 6 1 6 4 6 1 6 4 6
说明
开启了spj。
如果你的方案比答案优,会提示UKE,此时请联系管理员修改数据。
如果你的方案比答案差,分数会相应减损。

解题思路

做这个题,首先想到的应是深搜,宽搜,但是本人认为用宽搜更直白一些。
当然,两种方法都行。首先,是两个水壶a和b。用一个二维数组来记录水壶a,b的情况,(注:数据范围大,最好开一个比较大的数组)。

解题过程

按照题目中所给的信息,我们必须按照六个步奏依次进行,如图:
在这里插入图片描述

代码实现

如图可知,代码的基本结构为:

if(!vis[ca][b]){
			qu.push(node(ca,b,s+"1"));
			vis[ca][b]=1;
		}
		if(!vis[a][cb]){
			qu.push(node(a,cb,s+"2"));
			vis[a][cb]=1;
		}
		if(!vis[0][b]){
			qu.push(node(0,b,s+"3"));
			vis[0][b]=1;
		}
		if(!vis[a][0]){
			qu.push(node(a,0,s+"4"));
			vis[a][0]=1;
		}
		int c=a+b>ca?ca:a+b;
		if(!vis[c][a+b-c]){
			qu.push(node(c,a+b-c,s+"5"));
			vis[c][a+b-c]=1;
		}
		c=a+b>cb?cb:a+b;
		if(!vis[a+b-c][c]){
			qu.push(node(a+b-c,c,s+"6"));
			vis[a+b-c][c]=1;
		}

当然,这样写可以把六种情况一一列举,(其他的那个变量就自己去想了(~ ̄▽ ̄)~ ),按照描述,我们根据他便可以将BFS不断扩展下去,最后等水量为N的时候,就完了。
可能你会嫌代码量大,( ̄へ ̄),但你可以参照下面的方式:

int fd=a+b>ca?ca:a+b;//B->A
int fg=a+b>cb?cb:a+b;//A->B
const int dir[6][3]={
	{ca,b,1},
	{a,cb,2},
	{0,b,3},
	{a,0,4},
	{fd,a+b-fd,5},
	{a+b-fg,fg,5},
};
for(int i=0;i<6;i++){
	if(!vis[x[i][0]][x[i][1]]){
		qu.push(node(x[i][0],x[i][1],s+char('0'+x[i][2])));
		vis[x[i][0]][x[i][1]]=1;
	}
}

好了(( ̄. ̄)),我就不多说了,至于DFS的,可以自己去上网查查,也可以去洛谷,最后——

AC代码

#include <bits/stdc++.h>
using namespace std;
int ca,cb,n;
bool vis[4000][4000];
struct node{
	int a,b;
	string s;
	node(){}
	node(int qa,int qb,string ss){
		a=qa;
		b=qb;
		s=ss;
	}
};
queue<node> qu;
void bfs(){
	qu.push(node(0,0,string()));
	vis[0][0]=1;
	while(!qu.empty()){
		int a=qu.front().a;
		int b=qu.front().b;
		string s=qu.front().s;
		qu.pop();
		if(b==n){
			cout<<s.size();
			for(int i=0;i<s.size();i++){
				cout<<" "<<s[i];
			}
			cout<<endl;
			return;
		}
		if(!vis[ca][b]){
			qu.push(node(ca,b,s+"1"));
			vis[ca][b]=1;
		}
		if(!vis[a][cb]){
			qu.push(node(a,cb,s+"2"));
			vis[a][cb]=1;
		}
		if(!vis[0][b]){
			qu.push(node(0,b,s+"3"));
			vis[0][b]=1;
		}
		if(!vis[a][0]){
			qu.push(node(a,0,s+"4"));
			vis[a][0]=1;
		}
		int c=a+b>ca?ca:a+b;
		if(!vis[c][a+b-c]){
			qu.push(node(c,a+b-c,s+"5"));
			vis[c][a+b-c]=1;
		}
		c=a+b>cb?cb:a+b;
		if(!vis[a+b-c][c]){
			qu.push(node(a+b-c,c,s+"6"));
			vis[a+b-c][c]=1;
		}
	}
	return;
}
int main() {
    int t;
    cin>>t;
    while(t--){
    	memset(vis,0,sizeof(vis));
    	while(!qu.empty())qu.pop();
    	cin>>ca>>cb>>n;
    	bfs();
	}
    return 0;
}

抄袭者,死无对证。

WebGoC题解:水杯倒水问题与GoC绘图实践 本文详细解析了WebGoC在水杯倒水问题中的应用,通过图形化编程实现算法可视化。文章介绍了问题分析、算法设计及WebGoC绘图实现,帮助编程初学者理解条件判断和变量操作,同时提升图形化编程技能。 阅读详情

相关推荐

美团2017CodeM初赛A轮题解[A题]

美团2017CodeM初赛A轮题解[A题]题意:有一个大水缸,里面水的温度为T单位,体积为C升。另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升。现在要把大水缸的水倒入n杯水中,使得n杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留4位小数。 注意:一杯温度为t1单位、体积为c1升的水与另一杯温度为t2单位、体积为c2升的水混合后,温度变为(t1*c1...

ysheng 946

有趣问题——倒水问题

/ 智力题 / 有两个容桶, 小桶的容量是4升, 大桶的容量是9升, 怎样才能从河中恰好打上6升水呢? / 过渡 / / 答案 / 问题分析 刚拿到这个问题,我们可能互相倒来倒去,试了好久都没成功,但也许我们偶尔能成功,但是如果容器的容量又变了呢,或者要取的容量变了,我们是否可以从这类问题中寻找出一个规律,这才是解题的关键。 方法1:规约法 首先说下规约法: 问...

微信公z号: 罗晓胜,分享技术干货和有趣视频​ 3208

数据库1:数据库创建与管理(头歌云课)

在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 '

weixin_60530224的博客 2314

面试常见的智力题

3. 将C组的4个球分为C1和C2,每组两个球,这时候从A组和B组中找到两个正常的球,分别和C1和C2比较,天平不平衡说明球就在哪,假设在C1。9. 有一根金条,有一个工人为你工作7天,他们的工资的金条的1/7,并且需要当天结清,你只能对金条切割两次,怎么做?2. 再将5L的桶装满,导入6L的桶中(5L只能导进去1L,剩4L)只有两个无刻度的水桶,一个可以装6L,一个可以装5L,如何在桶中装入3L的水?2. 1-25个人,1,3,4.....25出列,剩2,4,6,....24。

cherry28256的博客 2667

从零到实战:用QCustomPlot在QT中绘制动态曲线图(含OpenGL加速配置)

本文详细介绍了如何在QT中使用QCustomPlot库绘制动态曲线图,并配置OpenGL加速以提升渲染性能。从环境搭建、动态数据可视化到OpenGL加速配置,手把手教你实现工业级动态曲线监控系统,适用于大数据量实时展示场景。

weixin_29019241的博客 351

反应动力学仿真软件:CHEMKIN_(12).CHEMKIN与其他软件的接口

通过上述介绍,我们详细探讨了如何将 CHEMKIN 与 MATLAB、Python、COMSOL、Aspen Plus 和 Ansys Fluent 等软件工具进行接口配置和数据交互。这些接口不仅能够显著提升 CHEMKIN 在反应动力学仿真中的应用效果,还能充分利用其他软件工具的强大功能,实现更复杂的数据处理和分析。希望这些内容对您在化学反应动力学仿真中的工作有所帮助。

kkchenjj的博客 1138

逻辑推理:倒水问题

② 大杯满了就清空,再把小杯剩下的倒入大杯中,重复执行上述步骤,直到得到想要的升数。有容量为5升与3升的水桶各一个,如何在不用测量的情况下,得到4升水?有容量为4升与9升的水桶各一个,如何在不用测量的情况下,得到6升水?这道题与上道题一样,就不展示了。① 把小杯装满,倒到大杯里。然后我们就得到了4升的水。

python_ok的博客 2234

LSTM 深度解析从原理推演到现代序列建模的演进

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),它通过引入记忆单元(Cell State)来解决普通RNN在长序列数据处理中的梯度消失问题。LSTM可以在长时间的序列中捕捉依赖关系,是一种非常适合处理时间序列、自然语言处理、语音识别等任务的深度学习模型。在LSTM中,记忆单元(Cell State)是一个贯穿整个序列的数据通道,用于存储和传递关键信息。记忆单元在LSTM的时间步之间保持信息的持久性,可以看作是一个长期记忆的“容器”。

hello.reader 3万+

倒水问题 (BFS搜索问题)

题目描述 Description时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问如何通过倒水或灌水操作, 用最少步数...

G_12_M的博客 2264

【国密】基于SM2的协同签名与协同解密方案

两方协同签名指客户端与服务端协同完成签名、验签操作,具体实现方案参考了信工所专利[3]。在业务应用中,两方或多方的协同签名一般采用门限签名方案可以用来构造。门限密码算法在多方协作的相关场景中应用十分广泛,可以实现数据联合授权、认证、密钥安全恢复、密钥安全交换等需求,在诸多分布式多方计算协议中均可见其身影。在上述两方协同签名方案中,最巧妙的地方在于签名值s分量的构造,通过一些列数学变换,得以恢复。以下从两方协同签名方案介绍入手,介绍门限密码在协同签名中的应用。解决上述问题的关键在于门限密码算法的巧妙构造。

听雨草堂 8388

Open3D 计算点云基本特征

在 Open3D 中,可以通过 PCA(主成分分析)来求得点云的特征值和特征向量。然后基于这些特征值,进一步计算各种几何特征,如线性、平面性、球度等。

纵马踏花向自由 1605

倒水问题题解(勿喷)

倒水问题 总时间限制: 1000ms内存限制: 65536kB 描述 有三个分别容量分别为a升、b升和c升的杯子(a>b>c>0,且b与c互质)。 a杯装满水,b与c均为空。 三个筒相互倒水且不准把水倒往三个筒之外。 请用最少的倒水次数,倒出d升水(任一杯中正好水量为d 即可),并输出倒水的过程。 输入只有一行:a、b、c、d 四个整数。输出第一行为倒水过程的总步

hsfz_zjc的博客 3328

杰理JL701N内置flash录音配置教程

本文详细介绍了内置Flash录音功能的配置方法。主要内容包括:1) 基础模式配置(开启音乐/录音模式、Flash录音宏定义);2) 录音参数设置(格式基准值、存储区域定义、容量配置);3) MP3编码特殊处理;4) 下载时的Flash格式化操作;5) 录音开关和播放接口的使用说明。配置过程涉及多个关键文件的修改,并强调存储容量的精确分配。

qq_42014563的博客 597

FJUT 倒水(倒水问题)题解

题意:开学了, fold拿着两个无刻度, 容量分别是5L和7L的量筒来问Anxdada, 说水是无限的, 并且可以无限次将杯子装满或者清空, 那怎么用这个两个量筒倒出恰好4L水了? 我说简单啊, 先装满7L的量筒, 倒给5L的量筒, 然后7L的还剩2L, 接着把2L的倒进5L的量筒内, 然后再装满7L的量筒, 再倒满5L的量筒, 此时7L的量筒内就恰好剩4L啦. fold又说, 那我任意指定两个量...

weixin_34381666的博客 308

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 337

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

倒水问题 (codevs 1226) 题解

【问题描述】      有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水。设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知x升壶为空壶, y升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z(z ≤ 100)升的水来。 【样例输入】     3 22 1 【样例输出】     14 【解

PbTfcLx 1087

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

GoC编程实战:用图形化代码解决水杯倒水问题(附完整题解)

本文通过GoC图形化编程工具,详细拆解并实现了经典的“水杯倒水”问题。文章从问题分析、GoC绘图基础、核心算法模拟到最终图形呈现,提供了完整的题解和实战代码,帮助初学者在可视化的乐趣中掌握编程逻辑与图形化思维。

tgb34567890的博客 914

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

题解 - 倒水问题(上海月赛2024.7乙组T3)

有三个没有刻度的杯子,容量分别为 a 升、b 升与 c 升。一开始,只有容量为 c 的杯子中灌满了水,另外两个杯子是空的。小爱可以将水从一个杯子倒去另一个杯子,倒水过程直到原杯子变空或新杯子变满才会停止。水只能在杯子间转移,不会凭空增加或减少。小爱希望通过倒水,能在某个杯子中,恰好出现一升水。若不可行,则在某个杯子中尽量出现较少的水(不为空),请输出最少能有多少水可以出现在某个杯子里,并输出最少需要多少步才能达到这一目的。

qq_73162098的博客 957

01背包-倒水

小秋家里来了n位客人,编号为。现在小秋要给每一位客人倒水。每个客人都有一个满意度,对于第iia_ib_iic_ic_i > a_id_iia_i0e_id_i现在小秋有m毫升水,请问他要怎么样给客人倒水,才能让所有客人的满意度之和最大呢?你只需要求出所有客人满意度之和的最大值。

nick_912912的博客 431

UVA10603-Fill(BFS)

ProblemUVA10603-Fill Accept:1162 Submit:10693 Time Limit: 3000 mSec Problem Description There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not gr...

weixin_30807779的博客 119

UVA-10603 倒水问题 题解答案代码 算法竞赛入门经典第二版

使用广度优先搜索和优先队列,如果找到最小的点则退出。找不到就遍历所有的情况。

Coding home - 漂流瓶jz 481

AtCoder ABC332 题解A-F

本文为AtCoder ABC332中A-F的题解,涉及题目算法包括线段树,状压dp,全排列枚举等

Fun_Total的博客 1550

(蓝桥杯)使用差分数组和前缀和解决区间更新问题——倒水

通过使用差分数组和前缀和,我们可以高效地进行区间更新操作。差分数组允许我们在 O(1) 时间内完成每次区间更新,而前缀和则可以在 O(n) 时间内还原出最终的数组。这种方法的时间复杂度为 O(n + k),适用于大规模数据。

m0_73581472的博客 1754
上一篇: Problem : [Usaco2007 Open]Catch That Cow 抓住那只牛
下一篇: 运算符合集:if与for循环
Cancelleds
博客等级 码龄8年 1110粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值