A:编程填空:简单的填空
描述
程序填空输出指定结果
|
|
输入
无
输出
|
|
样例输入
|
|
样例输出
|
|
Solution
观察可知,这题前期的a和b总体呈现2:1关系
析构后各减一
|
|
B:编程填空:简单的整数运算
描述
填写代码,按要求输出结果
|
|
输入
0~9之间的两个整数, m,n
输出
输出m*n,以及m*n + m + n
样例输入
|
|
样例输出
|
|
Solution
跟之前的题目师出同源,多重载一个加号,然后注意类型转换函数,不解释
|
|
C:编程填空:统计二进制里1的个数
描述
请你实现count函数。
该函数的功能为,给定一个正整数x,输出它的二进制表示里有多少个1
保证x < 232
|
|
输入
第一行一个正整数T,表示数据组数。
接下来T行,每行一个正整数,表示给定的x
输出
对于每组数据,输出一行一个数,表$x二进制表示里1的个数。
样例输入
|
|
样例输出
|
|
Solution
过于无脑,不解释
|
|
D:编程填空:attack
描述
程序填空输出指定结果
|
|
输入
.
输出
.
样例输入
|
|
样例输出
|
|
Solution
首先,肯定需要一个Slime类的构造函数
然后,我们还需要一个虚析构函数和一个name函数,这都看得出来
最关键的是这个attack函数,为什么说它关键呢,就是因为我们需要接受一个Slime*型对象,然后通过虚函数调用两边的name()函数,这样就完了
其实有时候正着看答案写得简单,反着做挺难的
|
|
E:编程填空:奇怪的括号
描述
填写代码,按要求输出结果
|
|
输入
.
输出
.
样例输入
|
|
样例输出
|
|
Solution
其实就是实现一个链式相加和一个乘号
注意一下输出流函数重载,不解释
|
|
F:编程填空:MySet
描述
实现 set 的子类并重载成员函数 insert() 与 erase(),使得:
- 在插入重复元素时,会输出提示信息 “Error insert v”,其中 v 是插入的元素,并不执行插入操作。
- 在删除不存在的元素时,会输出提示信息 “Error erase v”,其中 v 是想要删除的元素,并不执行删除操作。
其余情况下行为与 set 行为完全相同。
|
|
输入
(见程序代码)
输出
(见题目要求)
样例输入
|
|
样例输出
|
|
Solution
插入和删除时实现查找功能,不解释
|
|
G:编程填空:Singleton
描述
程序的输入为若干个整数,每次读取一个整数后,输出目前已经读入的整数数目,以及这些整数的和。
|
|
输入
若干行,每行一个整数。
输出
每次读取一个整数后,输出目前已经读入的整数数目,以及这些整数的和。
样例输入
|
|
样例输出
|
|
Solution
我们看到了主函数,肯定知道要写一个getInstance的成员函数,而且这个函数必须是静态的,它要返回instance这个指针
这个指针指向的是某个Singleton变量
然后我当时就在想,这个指针如果是变的呢?
其实,完全只需要一个类对象就能完成
其他时候直接返回就可以了
所以,p对应的instance只需要new 一个对象
|
|
H::又又见模板
描述
填写代码,按要求输出结果:
|
|
输入
第一行是整数n,表示有n组数据
每组数据有3行
第一行是10个整数
第二行是5个小数
第三行是4个不带空格的字符串,它们之间用空格分隔
输出
先输出10个整数
再连续输出两次5个小数的和 (不用考虑小数点后面几位,用cout直接输出即可)
再连续输出两次4个字符串连在一起的字符串
样例输入
|
|
样例输出
|
|
Solution
小技巧:外部可以留空的,说明类外面一定有东西要写
本题我们就直接进行一个加,就可以了
注意一下print_sum里面的写法,这样很方便
|
|
I:编程填空:怎么又是CArray3d三维数组模板类
描述
程序填空,按要求输出
|
|
输入
.
输出
.
样例输入
|
|
样例输出
|
|
Solution
这题,我们还是跟之前写得差不多
多了一个要重载的加号,不过问题不大
最大的问题是我漏写了一个符号,然后debug了一会
|
|
J:编程填空:Myaccumulate
描述
程序填空输出指定结果
要求实现类似accumulate的模板
|
|
输入
第一行是数组长度n (5 < n < 100)
接下来 n 行,每行一个小于等于1000的正整数。
再接下来 n 行,每行一个非空字符串,字符串均由小写字母组成,长度不超过 100
输出
按要求输出
样例输入
|
|
样例输出
|
|
Solution
不要忘了Pred类,其他的不解释
|
|
K:编程填空:Option
描述
Option 是个有趣的类,它可以保存一个正常的值,也可以是空值(None)。
程序填空,输出指定结果。
|
|
输入
.
输出
.
样例输入
|
|
样例输出
|
|
Solution
我们可以用一个bool型变量表示是否被赋值,然后可以用一个T型变量表示被赋的值
写出has_value和value函数,还有其他的几个构造函数并不难
难的是要重载这个*,这个是很难想到的
因为之前并没有重载过这个
然后,我们还是要把const和非const分开
至于这个双解引用?返回值类型是引用就行了,它会自动再解一次的
|
|
L:编程填空:学生排名
描述
输入学生和他们的分数,输出他们的排名及对应分数
|
|
输入
有多组数据
第一行是数据组数t(t <= 5)
对每组数据:
第一行为整数n(n<=100000)
接下来的n行每行开头是一个字符串s,代表学生名字,后面是他们的分数g(0<=g<=100),学生名字长度在0~20之间。如果有重复的名字输入那么只保留第一个出现的名字对应的所有信息。
输出
对每组输入数据,排序后输出学生姓名和成绩。排序规则:按照分数从大到小排序,分数相同的学生按照名字长度从小到大输出,名字长度再相同就按照字典序。
样例输入
|
|
样例输出
|
|
Solution
跟上次那道题一样,但是不要看错题目
如果有重复的名字输入,那么只保留第一个出现的名字对应的所有信息
上次那个题是:如果一个人出现如果两个同样名字的人考了同样的分数,那么保留一个就可以;意思是本题不允许名字相同的存在,上题允许名字相同但分数不同的人存在
注意一下lamdba表达式的用法
所以,我们需要一个东西来记录这个是否被输入过
就是一个fma的map容器
|
|
M:编程填空:满足条件的数
描述
请你实现print函数。
该函数的功能为,给定一个正整数x,从小到大输出所有非负整数y 满足 x and y = y。 正整数x < 232,并且满足二进制表示里最多存在10个1。
|
|
输入
第一行一个正整数T,表示数据组数。
接下来T行,每行一个正整数,表示给定的x
输出
对于每组数据,输出若干行,每行一个数。表示从小到大的满足条件的y,
样例输入
|
|
样例输出
|
|
Solution
这题其实我不会做,但是Gpt给出了很好的答案
如果y=(y-x)&x的话,这个原理自己去探索吧,确实是位运算里面一个很好的东西
|
|
N:编程填空:这是白给的题
描述
程序输出:
Hello,world!
请填空
|
|
输入
无
输出
Hello,world!
样例输入
|
|
样例输出
|
|
Solution
确实是白给的题
|
|
O:编程填空:这可不是多态
描述
补充程序,完成输出要求。
|
|
输入
无
输出
1 2 2 2
样例输入
|
|
样例输出
|
|
Solution
这道题要求我们分别对const和非const类写一个printV函数
耍个小聪明即可
|
|
P:编程填空:该调用哪个函数
描述
程序输出如下:
4
8
9
10
9
请填空
|
|
输入
无
输出
4 8 9 10 9
样例输入
|
|
样例输出
|
|
Solution
其实就是创建A对象的时候要加一
然后通过巧妙的小技巧把数凑成就可以了
|
|
Q:Base和Derived
描述
补充程序,使得程序输出指定的结果。
|
|
输入
无
输出
|
|
样例输入
|
|
样例输出
|
|
Solution
这里可以看出,我们要写一个Base类,然后写一个虚析构函数,再写一个让gem+60的虚函数,还有一个静态输出gem的成员函数
注意:gem是静态成员变量
|
|
R:排名学生
描述
补全程序,完成输入输出要求。
|
|
输入
第一行为一个整数n(n <= 1000000)
接下来n行每行开头是一个字符串s,代表学生名字,后面是他们的分数g(0 <= g <= 100),学生名字长度在1~5之间。
输出
对输入分数按照从大到小的顺序进行排序,每行输出一个分数,并在分数后面输出每个分数对应的名字,名字的顺序按照字典序从小到大排列。每个名字在每个分数中只能出现一次,即如果有两个同样名字的人考了同样的分数那么只保留一个即可。
样例输入
|
|
样例输出
|
|
Solution
跟上面的题目是差不多的
难点只是这道题要自己选择数据结构罢了
还有要自己派生到原生类里面
|
|
S:编程填空:求和
描述
完成代码填空。括号运算符实现一个求和的功能。每次调用括号运算符时进行计数。
|
|
输入
无
输出
|
|
样例输入
|
|
样例输出
|
|
Solution
重载一下该有的变量和运算符就行了,注意curr_value要赋初值,至于友元输出,已经帮你写好了
|
|
T:编程填空:诡异的求和
描述
请补充下列代码,使其可以输出输入所有数字的和。
|
|
输入
第一行若干个整数。保证整数个数不超过 10,每个整数的绝对值大小不超过 10。
输出
输出一个整数,表示输入所有数字的和。
样例输入
|
|
样例输出
|
|
Solution
有了前面的经验,我们只需要在最后析构的时候输出就可以了,哈哈
|
|
U:编程填空:神奇的模板类
描述
读入一个整数和一个字符串,输出该整数、该整数的两倍、该字符串、该字符串的两倍 (即字符串重复两次)。
|
|
输入
多组数据,第一行是一个整数m,表示有m组数据。
此后有n行,每组数据占一行,每行有一个整数和一个字符串,中间用空格隔开。
输出
对于每组数据,输出四行,分别为该整数、该整数的两倍、该字符串、该字符串的两倍(即字符串重复两次)。
样例输入
|
|
样例输出
|
|
Solution
就是,我们要有一种思路
叫做,不能模板化的不要强行模板化,要懂得分开
而且,这道题恰好说明了一点,就是题目没给类的括号的时候,一般外面都还有东西。
所以,我们直接在MyString类里面重载一个友元输出函数,这样直接达到目的了
再重载一个加号,一切完事
就是说,没给你下面的大括号,代表这个类肯定还有需要你补充的东西,同时,这也代表了外面肯定还有东西需要你补充
|
|
V:编程填空:麻烦的位运算
描述
写出函数中缺失的部分,使得函数返回值为一个整数, 该整数的第 i 位为 1 当且仅当 n 的右边 i 位均为 1。
请使用【一行代码】补全bitManipulation4函数使得程序能达到上述的功能。
|
|
输入
第一行是整数 t,表示测试组数。(t <= 20)
每组测试数据包含一行,是一个整数 n。
输出
对每组输入数据,输出一个整数,其第 i 位为 1 当且仅当 n 的右边 i 位均为 1。
样例输入
|
|
样例输出
|
|
Solution
好了,这道题一开始我想了很久想不出来
但是,当我瞟了一眼树状数组的模板的时候,突然会了
没错,就是我们的lowbit(x)大显身手的时候啦
我们假设 $(x_{10} = (\dots 011111)_2)$
那么,考虑$x$第一个为0的位,$(x+1)_{10}=(\ldots 100000)_2$,此时取$lowbit(x+1)=(100000)_2$,答案就是$lowbit(x+1)-1$
|
|
W:编程填空:排序
描述
对于数组里的每个元素a按照 a*x%p 为第一关键字,a 为第二关键字排序
|
|
输入
一行,2个整数x, p;
输出
按照 a*x%p 为第一关键字 a 为第二关键字排序后的结果
样例输入
|
|
样例输出
|
|
提示
pair模板类对象是可以用 < 比大小的
Solution
不用管什么pair模板型对象,直接开lambda表达式
注意[]和[=]的区别
|
|
X:编程填空:网络连接计数
描述
程序输出:
1
lostAllConnections
0
2
3
2
1
lostAllConnections
请填空
|
|
输入
无
输出
|
|
样例输入
|
|
样例输出
|
|
Solution
我们可以看出一个点,就是电脑直接分直接联网和间接联网两种,如果是直接联网的话,它是直接与Network类相连的,而如果是间接联网的话,它是与一个连着Network类的Computer相连,就是一个类似于树的结构,根节点与Network类相连,如果根节点断网的话,整棵树就都断网了
因此,我们可以设计bool变量表示它到底是直接联网还是间接联网,同时,还可以记录一下通过它间接连着Newwork的电脑数目
然后再使用一些骗分小技巧就可以了,反正这里只有三台电脑,弄起来也方便
当然,做了这些题之后,最近我们对于int&的敏感度也有所提高
|
|
Y:更强的卷王查询系统
描述
古人云:“开卷有益”。但是,著名的社会学家小明认为内卷是有害的,并且他正在写一篇与P大内卷现状有关的论文,需要选取具有代表性的“卷王”们进行访谈。小明现在搞到了一份长长的成绩单,拜托你写个程序,帮他找出成绩单上的“卷王”们。
“卷王”的定义是:给定一组课程,这组课程全部上过的学生中,这组课程平均分最高的学生。小明已经通过复杂的数据挖掘手段得到了要分析的课程组,现在需要你按照上述定义,对每组课程找出那个真正的“卷王”。
输入
第1行:一个整数n, 1 <= n <= 100000
第2~(n+1)行:每行有用空格分隔的两个字符串和一个整数,前两个字符串分别代表课程名和学生名,最后一个整数代表这个学生在此课程中取得的成绩。输入保证课程名和学生名只包含字母,且一个学生在一个课程中不会出现两次成绩。输入保证课程数量不超过1000门,且每门课的学生数量不超过100人。输入不保证任何顺序。
第n+2行:一个整数m,代表查询的个数,即课程组的组数。1 <= m <= 10
接下来m行:每行是一个课程组,第一个整数k代表该组课程的数量,1 <= k <= 100,后面有k个字符串,表示k个课程名。整数k和字符串之间均用一个空格分隔。数据保证课程名一定在之前出现过。
输出
输出为m行,每行对应一个课程组,输出该组课程平均分最高的学生,只考虑学过该组全部课程的学生。如果平均分最高的学生多于一个,输出姓名按英文词典排序最靠前的学生。数据保证对每组课程,都存在学过该组所有课程的学生。
样例输入
|
|
样例输出
|
|
Solution
一开始我的做法TLE,因为我算时间复杂度的时候忘记乘上find的复杂度了,先阐述一下这个错误做法:
用一个map+multimap存上某门课某人的分数,再用一个map存人名
输入完全部的课程名字之后,对每一个人进行遍历,将提到的每门课程都有参与的人加入到vector中,再找出他们的均分什么的
这样时间复杂度确实太高了
于是,我换了一种解法
先将每个人学的课程存入一个map里面
然后,在遍历(先遍历人,再遍历课程,这样更方便跳出循环)的时候直接先找出平均分,最后一遍sort,就完事了,优化了挺多的
|
|