【2022暑期训练-1】7-9 银行业务队列简单模拟
题目:设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式:输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式:按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例:18 2 1 3 9 4 11 13 15
输出样例:11 3 2 9 11 4 13 15
思路本题就单纯模拟两个队列出队就好了,A出两个后B就出一个,注意A出第二个要判队列空不空,直到有一个队列空为止跳出,最后再循环把剩下有人的队列输出完。根据上述模拟,代码如下:
代码1234567891011121314151617181920212223242526272829303132333435363738 ...
【2022暑期训练-1】7-8 彩虹瓶
彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。
假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。
如果工厂里发货的顺序比较好,工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色,工厂按照 7、6、1、3、2、5、4 这个顺序发货,则工人先拿到 7、6 两种不能装填的颜色,将其按照 7 在下、6 在上的顺序堆在货架上;拿到 1 时可以直接装填;拿到 3 时又得临时码放在 6 号颜色箱上;拿到 2 时可以直接装填;随后从货架顶取下 3 进行装填;然后拿到 5,临时码放到 6 上面;最后取了 4 号颜色直接装填;剩下的工作就是顺序从货架上取下 5、6、7 依次装填。
但如 ...
【2022暑期训练-1】7-7 求前缀表达式的值
题目:算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:1+ + 2 * 3 - 7 4 / 8 4
输出样例:113.0
思路由于是求前缀表达式,可以从后往前遍历,这样可当作后缀表达式来求。需要注意的是不要单纯地以为用单个字符来表示不同对象就可以正确结果,还应该考虑什么负号啊,正号啊,还有超过个位数的运算,可改成用字符串来作为输入的不同对象,就完事了。代码如下:
代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include <b ...
【2022暑期训练-1】7-7 求前缀表达式的值
题目:算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:12+3*(7-4)+8/4
输出样例:12 3 7 4 - * + 8 4 / +
思路将中缀表达式转化为后缀表达式的方法就是从头到尾去遍历中缀表达式,利用栈来存运算符,看到数字相关的字符就输出,当遇到运算符(包括括号)时,我们要去判断该运算符与栈顶运算符优先级谁大谁小,若栈顶的大,那么栈顶的运算符可以被输出,但要是该运算符的优先级更大,我们便不能着急的输,因为我们还不知道后面有没有比它更高优先级的运算符,只能将其压入堆栈。需要注意碰到括号的情况,当碰到的是左括号,我们是将其当作高优先级的运算符直接压入栈中,而碰到右括号时,我们应将栈顶的运算符输出,知道栈顶 ...
【2022暑期训练-1】7-5 括号配对问题
题目:现在,有一行括号序列,请你检查这行括号是否配对。
输入格式:第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“, “]”, “(“, “)” 四种字符
输出格式:每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
输入样例:12343[(])(])([[]()])
输出样例:123NoNoYes
思路给定一个括号序列,看序列是否合法,关键要明白如何判定序列是不合法的,而不合法其实就是有括号没有被正确地匹配掉,从左向右去遍历序列,它可包括以下三种情况:第一,遍历到了右括号,但是之前没有左括号和它匹配了;第二,遍历到了右括号,在它之前有左括号,但是很遗憾,不满足大对大、中对中、小对小,匹配不上;第三,遍历结束了,发现还有左括号没有被匹配掉。切记情况一定要讨论清楚了。结合上述,又因为每次匹配的时候,遍历到的那个右括号必须是和之前最后遇到的左括号匹配(显然,毕竟数学上不就这 ...
【2022暑期训练-1】7-4 简单计算器
题目:本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1存放数字,另一个堆栈S2,存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:1.从S1中弹出两个数字,顺序为n1和n2;2.从S2中弹出一个运算符op;3.执行计算n2 op n1;4.将得到的结果压回S1;直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。
输入格式:输入首先在第一行给出正整数 N(1<N≤10 3),为 S1中数字的个数。第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +、-、*、/ 这四种运算。一行中的数字和符号都以空格分隔。
输出格式:将输入的数字和运算符按给定顺序分别压入堆栈 S1和S2 ,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10^9。如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。
输入样例:123540 5 8 ...
【2022暑期训练-1】7-2 高精度求累加和
题目:使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?
输入格式:输入在一行中给出1个位数不超过100位的整数N。
输出格式:对每一组输入,在一行中输出1+2+3+……+N的值。
输入样例:110
输出样例:155
思路:由于本题的位数过大,所以在高精度计算累加和时需要使用等差数列的求和公式(a1+an)*n/2,通过模拟列竖式计算等手算操作编写高精度运算函数求符合题目输入的上式即可。代码如下:
代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include <bits/stdc++.h>using namespace std;vector<int> N;vector<int> add(vector<int> &A,vector<int> & ...
【2022暑期训练-1】7-1 求两个一元多项式的和
题目:求两个一元多项式的和。
输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:输出分1行,分别以指数递降方式输出和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:124 3 4 -5 2 6 1 -2 03 5 20 -7 4 3 1
输出样例:15 20 -4 4 -5 2 9 1 -2 0
思路:求两个一元多项式的和,首先我们可先想这多项式要怎么表示,根据它的特点:由多个”系数+指数”项加减法而来,我们不妨利用一个map来表示一个多项式,将指数作为key,系数作为val,这样做两个多项式加法的时候,直接让同一key的val做加法就好了。代码如下:
代码:12345678910111213141516171819202122232425262728293031323334353637383940#include <bits/stdc++.h>using namespace std;int m ...
day05 c++ 常用位运算
一、简介
特性:方便且高效
注意:结果不能直接输出,要赋值给一个变量才行
位逻辑运算符
12345& (“与”)^(“异或”)|(“或”)~(“取反”)//结合性为从左到右,优先级高于逻辑运算符,低于比较运算符(正因为如此所以你再写什么n&1等于0一定要把n&1加括号!!!),从高到低依次为&、^、|
移位运算符12<<(左移)>>(右移)
二、位逻辑运算
1.&运算:两个数二进制对应位都为1那一位才为1
12340&1=0;0&0=0;1&0=0;1&1=1;
通常用于取位操作,如常取末位:num&1结果就是取num的二进制的最末位,而以此可判别num的奇偶,结果为0则为偶,结果为1则为奇
2.|运算:两个数二进制对应位有一者为1那一位即为1
12340|1=00|1=11|0=11|1=1
通常用于二进制特定位上的无条件赋值,如num|1结果是把二进制最末尾强行变为1,若再在这个结果上减1,可将num变为最接近它的偶数
3.^运算:二进制位同则0,异则1 ...
day04 C++集合操作
今日份知识分享:C++集合操作set介绍C++ STL之所以得到广泛赞誉,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是STL封装了许多复杂和大量常用的数据结构操作。
set是一种关联式容器,set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red- Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被multimap内部采用的就是一种非常 高效的平衡检索二叉树:红黑树,也成为RB树(Red- Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。
常用方法begin:返回set容器的第一个元素
end:返回set容器最后一个元素
clear:删除set容器所有元素
empty:判断set是否为空
max_size:返回set容器可能包含的元素最大个数
size:返回当前set容器元素个数
常用操作除了一般方法外,set集合常用操作便为求交集、并 ...