首页 > 技术文章 > 蓝桥杯——校内模拟题目分析

cndccm 2020-03-23 22:27 原文

蓝桥杯——内模拟题目分析

(顺序有可能会有点乱,不要信上面填的答案,看解析,后面附有答案)

1

 

 

这道题就不用多说了吧,计算机的单位之间进制为210次方

所以答案为:   15488

附上常用的计算机单位  由大到小   TB GB MB KB K

 

2

 

 

 

 

这里来确认下约数的定义    简单的说就是能够整除   

例如  4   对应的约数就有124

OK  那这个题应该就会很简单了吧

这里用程序作答

 

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,j;
 5     int sum=0;
 6     for(i=1;i<=1200000;i++)
 7     {
 8         if(1200000%i==0)
 9         {
10             sum++;
11         }
12     }
13     printf("sum=%d\n",sum);
14     return 0;
15 }

代码就不做解释了   很简单

 

 

3

 

 

 

 

 

这里呢提供两种方法   

(1) 暴力枚举  当然 这里的数比较小  很快就出结果了

下面是代码

#include<stdio.h>
int main()
{
    int i,j;
    int sum=0;
    int N;//输入N 这里是2019
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
        int j=i;
        while (j!=0)
        {
            if(j%10==9)
            {
                sum++;
                break;
            }
            j/=10;
            /* code */
        }
        
    }
    printf("%d\n",sum);
    return 0;
}

 

 

   那么  下面我们看第二种

答案是   544

(2)数学分析的方法

我们先来看个位数

1个

两位数   有9+1+8=18

  下面看三位数  9*(18+1)+=252

那么1-1000共有271

故1-2000共有542

再加上2009 2019

共计    544   这个方法有点绕  不是数学特别好的还是建议直接枚举

 

 

4:

 

首先  叶节点     没有下一层的节点  可以简单理解为尾巴节点     

一点  必须要有一个开始节点     下面才可以开始分叉   答案应该就是2018

 

 

5:

 

 

 

 

分析题目   符合条件的数  为 左边有比他小的  右边有比他大的

 

 

那么,我分析算法

 

第一种  一个一个去找呗     这里就不多说了

 

 

我们主要看第二种

 

首先我们想   对于第n个数  如果我们知道前面n-1个数的最小值  和后面n+1,,,到结尾的最大值  我们是不是只需要简单的 对比一下就可以得出结果   

那么我们就要获取  最大最小  信息   

我们采用动态规划的想法    以求最小为例      我们知道前n个的最小值(记做min)  我们算前n+1 的最小值 是不是就要比较   min和第n+1个数   并得出前n+1个的最小值  

所以    我们只需要遍历两遍 就个得出最大和最小    然后我们在遍历一遍就能得出最后答案      

下面附上代码

(先发布了)

最近两天补全代码板块 

 

 

6:

 

 

首先  题目的意思就是说判断该单词是不是   辅音 元音 辅音 元音 

其实这个题目  基本 没有什么讲头    就判断就行了呗   

提示一下(当然有点多余) 当第一个不是辅音的时候直接结束就好了  

还有长度不到四直接结束就好了  

当然还有好多  都不是说会提供太多便利的思想   但,还是可以拓展下自己的思维的   

这个题目就不上代码了

 

 

 

 

7:

 

 

 

这个题目呢 我没有发现太简单的方法  个人认为就是全排解的问题  

 关于全排列  本人博客首页有详细解析   就不多说了

 

关键就是找到所有可能的序列  进行判断就好了    

再有一个 就是  用全排列的时候   可以在每次交换后就进行判断   会剩下好多时间  

特别是当序列特别长的时候      关于n的问题   其实我们可以当做每个前面已经有n了  这样就好理解点

代码的话   也不写了       判断的代码   相信  学过编程的人都会写  

另外 附上全排列的链接      https://www.cnblogs.com/cndccm/p/12461902.html

 

 

这个题就稍微有一点点意思了  

首先我来说说我的最初想法   我想上两个数组  一个往另一个种   

后来 我咋写TM都有bug   然后我就烦了  不写了 

后来受到启发  发现了有个更好的方法   

 

 

 

我们用表格中的一块来表示我们的地  上面那一块就是我们最初的草   (以一个草为示例)

我们假设时间为三个月  

我们看三个月后是什么样子

 

 

 

发现什么规律了吗   

是不是有个有点规则的图形   当然  你的地要足够大  

相比一月一月的让他去长 要方便的不是一星半点吧  

    所以  我的意思就是按照这个图形的规律去长草   规律不用我多说吧

n月  从一开始草的位置开始  左边n右边n上边一个   

然后上边一个 左右各n-1   知道左右都为0

上下都是对称的  就不说下面的了  

需要注意的就是边界的问题  

每次长新草之前都要考虑好是否已经到达边界  

当然开头要进行遍历  记录最初所有草的位置   然后按照规律长草就好了 

最后输出就OK了    

 

package com.cryptape.framework.system;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] argv){


        // 获取源数据
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        int[][] source = new int[m][n];

        // 存哪些点有草  eg i,j
        ArrayList<String> sourceGreenList  = new ArrayList();

        // 获取原始草
        for(int i=0; i<m; i++ ){
            char[] tmp = in.next().toCharArray();
            for(int j=0; j<n; j++){
                if(tmp[j]=='g'){
                    source[i][j]=1;
                    sourceGreenList.add(i+","+j);
                }else {
                    source[i][j]=0;
                }
            }
        }

        // 获取月数
        int count = in.nextInt();

        //
        for(int i=0; i<sourceGreenList.size(); i++){

            // 解析出点的 (p,q)
            String[] tmp = sourceGreenList.get(i).split(",");
            int p = Integer.valueOf(tmp[0]); //
            int q = Integer.valueOf(tmp[1]); ////
            for(int j=0; j<=count; j++){
                if(q-j>=0){
                    for(int t=0; t<=count-j; t++){
                        if(p-t>=0){
                            source[p-t][q-j] = 1;
                        }
                        if(p+t<m){
                            source[p+t][q-j] = 1;
                        }
                    }
                }
                if(q+j<n){
                    for(int t=0; t<=count-j; t++){
                        if(p-t>0){
                            source[p-t][q+j] = 1;
                        }
                        if(p+t<m){
                            source[p+t][q+j] = 1;
                        }
                    }
                }

            }
        }


        for(int i=0; i<m; i++){

            for(int j=0; j<n; j++){
                if(source[i][j]==0){
                    System.out.print(".");
                } else {
                    System.out.print("g");
                }
            }
            System.out.println();
        }


    }
}

 

 

 

 

 这是用java写的   (不过这次模拟的是C语言哈   不过道理都一样  )

 

 

下面  还有最后一个题  

 

 

 

 

 

看着题目  看着花花丽丽  其实就是个排序呗

找出来要表演的节目   按照顺序输出就完了呗   

 

我的建议是  排序的时候 排下标  然后找出分数最高的m个坐标   然后按照下标的大小对应先后关系   表演不就完了

  实在要说有什么优化的方法  无非就是 排序算法写的精妙一点  

再有就是   在定最后顺序的时候 不要排序了

吧节目数组定为二维数组  直接修改一个特定的第二排的值 这样只需对  节目数组 要表演的节目数组 进行一次遍历就OK 了   

 代码就不写了   相信大家都会写

 

好了  这次的模拟到这里就结束了       

 

这次的模拟说真的其实技术含量还是比较低的 

相对于蓝桥杯的历届真题 还是很水的    

 

推荐阅读