C语言蓝桥杯代码改变世界

蓝桥杯C语言C组校内赛题目解析

2019-12-06  本文已影响0人  缘点点

今天事非常多,所有事情都凑在一起忙的不可开交。早上社团本来要搞活动,又刚好凑上实训课,三四节来不及搬东西过去,只能下课后再过去帮忙,手机没电,还是要忙到接近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语言的代码水平有一个一定的认识。对以前的一些基础还算比较熟悉,当然可能也和这些天写题解有不小的关系。
对于一些以前抗拒的算法,现在也不觉得理解过于困难,可能是已经慢慢适应了这个难度的题目。。。
最后,希望明年的蓝桥杯能够获个奖,也算圆一个去年没圆的梦吧。

上一篇下一篇

猜你喜欢

热点阅读