蓝桥杯C语言C组校内赛题目解析
今天事非常多,所有事情都凑在一起忙的不可开交。早上社团本来要搞活动,又刚好凑上实训课,三四节来不及搬东西过去,只能下课后再过去帮忙,手机没电,还是要忙到接近12点半才来得及回宿舍吃外卖。
饭还没吃几口,比赛就马上要开始了,只能放下手中的外卖打开电脑。我们学校的蓝桥杯校内赛定在今天13:00-17:00举行。时长和蓝桥杯正赛一样,都是4个小时。
本次试题的难度,说实话比今年三月去参加的正赛,要粗糙。怎么说呢,就是简单的题目特别简单,困难的题目特别难,但胜在所有题目都能暴解。现在比赛也比完了,就分享一下今天做题的一些感想和对题目的一些分析吧。虽然感觉会做的题真的不多。。。
题目:
1.
不超过19000的正整数中,与19000互质的数的个数是多少?
- 解析:
互质的题以前真的接触的很少,印象中这是第二次遇到互质的题目,但做起来也不算慌张,因为也算有点经验了,辗转相除应该是最好的暴解了吧。。。虽然我还是把这题写了个函数。
代码挺长的,大多都是废话,主要是函数的写法,辗转相除,做题比较多的人应该再熟悉不过了。
#include <stdio.h>
int Gcd(int m,int n)
{
int o;
while(n>0)
{
o=m%n;
m=n;
n=o; }
return m;
}
int main()
{
int a,i,b,s;
while(scanf("%d",&a)!=EOF)
{
if(a==1)
{
printf("1\n");
}
else{
s=0;
for(i=1;i<a;i++)
{
b=Gcd(i,a);
if(b==1)
{
s++;
}
}
printf("%d\n",s);
}
}
return 0;
}
2.
在计算机存储中,12.5MB是多少字节?
- 解析:
这题怎么说呢。。。感觉有点凑数,应该属于签到题中的签到题吧?蓝桥杯需不需要考计算机二级的知识咱也不知道咱也不敢问。。。
直接12.5×1024×1024 计算器完成,不写代码了
答案应该是13 107 200
3.
在一个8x8的国际象棋棋盘的左上角放一枚棋子,每一步只允许棋子向右或向下移动一格,不允许移出棋盘,14步后可移动到棋盘的右下角。
请问本质不同的移动方案有多少种?
两个移动方案称为本质不同的,是指这两种方案中至少存在某一步,一种方案中是向右走,一种方案中是向下走。
- 解析
说实话这题挺恶心的。。。因为太久没刷题了,对dfs,bfs这类题是真的不熟悉了,今天也是找以前的代码出来改了小半天,最后还是弄了个死循环。过程图大概如下:
image.png
最后放弃了,手动笔算了个18交了上去。。。
4.
一棵10层的二叉树,最多包含多少个结点?
注意当一棵二叉树只有一个结点时为一层。
- 解析:
二叉树问题和C语言关系还是挺密切的。。。虽然这题的问题同样问的有点弱智。。。可能唯一要注意的点就是不要粗心直接把第十层的结点数上传了吧。。。题目要求的是全部的结点
答案应该是1023
5.问题描述
给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,...,w变为z,x变为a,y变为b,z变为c。
例如,lanqiao会变成odqtldr。
输入格式
输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
输出一行,表示加密后的密文。
- 解析:
同样属于签到题,ASCLL码类的问题。至于应该要加多少减多少得到答案,自己在纸上写一遍就清楚了。
- 代码:
#include<stdio.h>
int main()
{
char ch;
while(scanf("%c",&ch)!=EOF){
if(ch >= 'a' && ch <= 'w'){
ch += 3;
}
if(ch >= 'x' && ch <= 'z')
ch -=23;
printf("%c", ch);
}
return 0;
}
6.问题描述
在数列 a[1], a[2], ..., a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,表示给定的数列。
输出格式
输出一行包含一个整数,表示答案。
- 解析:
这题。。。怎么说呢,浪费了我差不多一个半小时。而且最后得到的答案依然不尽人意。
其实这题一眼看上去就有种dp的感觉。。。但我没学过dp只能是硬着头皮暴解:
我的想法是,如果一个数是中心的话,那么前后肯定会有数比他大和比他小,那么只要符合这种情况就让一个数得到1判断正确,最后同时符合有数比他大和比他小的情况就让答案+1。
所以我最终的代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[10000];
int s;
int o=0,p=0;
int x=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int j=0;j<n;j++){
s=a[j];
while(j>=1){
j--;
if(s>a[j]){
o=1;
break;
}
}
j=0;
while(j<=n-1){
j++;
if(s<a[j]){
p=1;
break;
}
}
if(o==p){
x=x+1;
}
}
printf("%d",x);
return 0;
}
代码可能看起来挺乱的,但思路应该还是能看出来的,判断数组中其中一个数,只要他的前面有比他小的同时后面也有比他大的数,那么这个数就是递增三元组的中心。可惜算出来的结果似乎差强人意。。。
7.问题描述
一般情况下,如果一个单词在段首,则第一个字母大写,后面的字母小写。
给定一个单词,单词中可能包含大小写字母,请按第一个字母大写,后面字母小写的方式输出。
输入格式
输入一行,包含一个单词,单词中只包含大写或小写英文字母。
输出格式
输出单词在段首时的形式,第一个字母大写,其他字母小写。
- 解析:
这题相对是比较简单的题目了吧,算第五题的变种,只是我在思考的时候往过于复杂的方向去想了,甚至动用了数组。。。也由此浪费了大量的时间,导致后面的题目没有足够的时间完成。
- 代码:
#include<stdio.h>
int main()
{
char a[100];
scanf("%c",&a[0]);
if(a[0] >= 'a' && a[0] <= 'z'){
a[0] -= 32;
}
printf("%c",a[0]);
for(int i=1;i<=100;i++){
scanf("%c",&a[i]);
if(a[i] >= 'A' && a[i] <= 'Z'){
a[i] += 32;
}
printf("%c",a[i]);
}
return 0;
}
其实很明显,这题只要在输入的时候使用%1c。就可以先直接读取第一位数,然后后面的数可以分开读取,然后再用两种不同的if来处理这两个参数就可以完成了,根本没必要写个数组,还逐步输入。。。
8.问题描述
小明开了一家花店,这天,有个客户定了非常多的花,按客户的需要,这些花要排成 n 行 m 列。
小明要将这些花运送到客户那,然而由于花太多,需要分两辆车才能装下。
小明怕自己弄错花的顺序,因此在分车的时候,他准备将前面一些列(注意不是行)的花放在第一辆车上,将其实的花放在第二辆车上。
已知每盆花的重量,要使第一辆车和第二辆车尽可能总重量一致,请帮助小明分装这些花,请告诉小明两辆车的重量最小差多少。
输入格式
输入的第一行包含两个整数 n, m,分别表示行数和列数。
接下来 n 行,每行 m 个正整数,分别表示每盆花的重量。
输出格式
输出一个整数,表示总重量最接近时两车的重量之差(的绝对值)。
9.问题描述
小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
请告诉小明,k 个月后空地上哪些地方有草。
输入格式
输入的第一行包含两个整数 n, m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。
输出格式
输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
10.问题描述
小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
输入格式
输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
第二行包含 n 个整数,依次为每个节目的好看值。
输出格式
输出一行包含 m 个整数,为选出的节目的好看值。
后面的三题并没有足够的时间去做,因为社团的活动有手尾需要收拾,只能提前结束比赛,先去帮忙收拾好东西了。。。这三题先留在文章里,待我哪天有空再回来重写思考,尽量把他做出来吧。
通过本次校内赛也算是让自己对自己目前C语言的代码水平有一个一定的认识。对以前的一些基础还算比较熟悉,当然可能也和这些天写题解有不小的关系。
对于一些以前抗拒的算法,现在也不觉得理解过于困难,可能是已经慢慢适应了这个难度的题目。。。
最后,希望明年的蓝桥杯能够获个奖,也算圆一个去年没圆的梦吧。