蓝桥杯24省赛C++中高级组题干题解
考得不差,希望国赛不要考崩(如果国赛是下午考试的话,那我就得半夜爬起来做蓝桥杯的题目了。这真是个悲伤的事情)。
本帖只提供六道编程题的解题思路,部分题目并不提供实际的代码(因为我赛时忘记把代码截图下来了)。
T1 - 看书
题干描述: 一本书共 页,小明计划第一天看 页,此后每一天都要比前一天多看 页,请问小明几天可以看完这本书?
输入格式: 一行输入三个整数 ,, ,分别表示书的总页数、计划第一天看的页数以及此后每天都要比前一天多看的页数,整数之间以一个空格隔开。
输出格式: 输出一个整数,表示小明几天可以看完这本书。
样例输入:100 10 5
样例输出:5
解题思路: 防爆零题。用一个 while
循环来判断还有多少页的书需要看,循环里拿一个变量来记录循环次数作为答案即可。
T2 - 数字交换
题干描述: 给定一个正整数 ,请将 的最高位与最低位的数字进行交换,并输出交换后的结果。如果交换后的结果有前导 ,去除前导 后再输出结果。
输入描述: 输入一个正整数 。
输出描述: 输出答案。
样例输入: 173
样例输出: 371
解题思路: 以字符串的形式来读入字符,先用 C++ 自带的 swap
交换该字符串的第一位和最后一位。之后用 while
循环记录第一个合法数字出现的位置(即删除前导零)。最后用 string
类的 .substr()
方法截取字符串有效子串。
T3 - 出现奇数次的数
题干描述: 给定 个整数,其中只有一个数出现了奇数次,请找出这个数。
输入格式:
第一行输入一个整数 。 第二行输入 个整数 ,整数之间以一个空格隔开(数据保证只有一个数出现了奇数次)
输出格式: 输出一个整数,表示出现了奇数次的数。
样例输入:
7
6 2 4 6 4 2 6
样例输出:
6
解题思路:
这道题可以有多种算法来解。一种方法是使用 sort
函数对数组排序,然后找出某个出现奇数次的数即可。还可以用 STL 的 map
数据结构,类似桶排序的方法,来记录某一个键出现的次数,最后扫一遍就可以找出来了。
最方便的做法是使用异或的性质来快速找到某个出现奇数次的数。具体地,将数组中的所有元素依次进行异或运算,最终结果就是唯一一个出现奇数次的数,因为出现偶数次的数都会在异或中抵消掉。
代码展示:
#include <iostream>
using namespace std;
int main(){
int n, t, ans = 0;
cin >> n;
while(n--){
cin >> t;
ans ^= t;
}
cout << ans << endl;
return 0;
}
T4 - 字母移位
这道题是我觉得整一场比赛中最有问题的题目了。开了
long long
过不了,不开long long
不取模竟然是过得了的。这证明这道题的数据是有问题的。(一个半小时的考试,这道题浪费了我一个小时的调试时间。我只能说,出题组太垃圾了)。