2020年第十一届蓝桥杯模拟赛解题报告

简介: 2020年第十一届蓝桥杯模拟赛解题报告

1、单位换算

【问题描述】

在计算机存储中,15.125GB是多少MB?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【解题思路】答案:15488

1GB=1024MB

15.125×1024=15488

2、约数

【问题描述】

1200000有多少个约数(只计算正约数)。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【解题思路】答案:96

直接暴力:

#include<stdio.h>
int main() 
{
  int i,j,sum;
  sum=0;
  for(i=1;i<=1200000;i++)
  {
    if(1200000%i==0)
      sum++;
  }
  printf("%d\n",sum);
  return 0;
}

3、多少个数字9

【问题描述】

在1至2019中,有多少个数的数位中包含数字9?

注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【解题思路】答案:544

也是直接暴力一个一个数去判断:

#include<stdio.h>
int main()
{
  int i,j,k,m,n;
  int sum=0;
  for(i=1;i<=2019;i++)
  {
    m=i;
    while(m!=0)
    {
      n=m%10;
      if(n==9)
      {
        sum++;
        break;
      }
      m=m/10;
    }
  }
  printf("%d\n",sum);
  return 0;
}


4、叶结点的个数

【问题描述】

一棵包含有2019个结点的二叉树,最多包含多少个叶结点?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【解题思路】答案:2018

这个题有点数据结构的关系,当时用到两个公式,n0=n2-1,总结点数=n0+n1+n2,并且n1要么为0要么为1,所以可以求出n0=2018;

1、数位递增的数

【问题描述】

一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。

给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?

【输入格式】

输入的第一行包含一个整数 n。

【输出格式】

输出一行包含一个整数,表示答案。

【样例输入】

30

【样例输出】

26

【评测用例规模与约定】

对于 40% 的评测用例,1 <= n <= 1000。

对于 80% 的评测用例,1 <= n <= 100000。

对于所有评测用例,1 <= n <= 1000000。

【解题思路】这个题数据不大,直接暴力,先把数分散存入数组里面,然后前后判断后面的数是否大于前面的数

#include<stdio.h>
#include<string.h>
int main()
{
  int i,j,k,m,n,t,sum,flag;
  int a[100000];
  scanf("%d",&n);
  sum=0;
  if(n<10)//小于10的可以直接判断
    sum=n;
  else
    sum=9;
  for(i=10;i<=n;i++)
  {
      m=i;k=1;
      while(m!=0)
      {
        t=m%10;
        a[k++]=t;
        m=m/10;
      }
      k--;
      flag=0;
      for(j=1;j<=k;j++)
      {
        if(a[j]<a[j+1])
        {
          flag=1;
          break;
        }
      }
      if(flag==0)
        sum++;
  }
  printf("%d\n",sum);
  return 0;
}

2、元音辅音元音辅音

【问题描述】

小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。

给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。

元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。

【输入格式】

输入一行,包含一个单词,单词中只包含小写英文字母。

【输出格式】

输出答案,或者为yes,或者为no。

【样例输入】

lanqiao

【样例输出】

yes

【样例输入】

world

【样例输出】

no

【评测用例规模与约定】

对于所有评测用例,单词中的字母个数不超过100。


【解题思路】这个题是组成的单词正好分四段,所以只要判断元音的连续字段为2就行了

#include<stdio.h>
#include<string.h>
int main()
{
  char s[105];
  int i,j,k,m,n,flag;
  int sum;
  while(scanf("%s",s)!=EOF)
  {
    n=strlen(s);
    sum=0;
    if(s[0]=='a'||s[0]=='e'||s[0]=='i'||s[0]=='o'||s[0]=='u')
    {
      printf("no\n");
      continue;
    }
    for(i=0;i<n;i++)
    {
      flag=0;
      while(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
      {
        if(flag==0)
          sum++;
        i++;
        flag=1;
      } 
    }
    if(sum==2)
      printf("yes\n");
    else
      printf("no\n");
  } 
  return 0;
} 

3、递增三元组的中心

【问题描述】

在数列 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],相邻的整数间用空格分隔,表示给定的数列。

【输出格式】

输出一行包含一个整数,表示答案。

【样例输入】

5

1 2 5 3 5

【样例输出】

2

【样例说明】

a[2] 和 a[4] 可能是三元组的中心。

【评测用例规模与约定】

对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。

对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。

【解题思路】这个题思路很明确,就是要找满足的递增三元组且中心数只能出现一次,用book[]标记一下。

#include<stdio.h>
#include<string.h>
int a[1010],book[1010];
int main()
{
  int i,j,k,m,n,sum;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
  memset(book,0,sizeof(book));
  sum=0;
  for(i=1;i<=n;i++)
    for(j=i+1;j<=n;j++)
      for(k=j+1;j<=n;j++)
      {
        if(a[i]<a[j]&&a[j]<a[k]&&book[a[j]]==0)
        {
          book[a[j]]=1;
          sum++;
        }
      }
  printf("%d\n",sum);
  return 0;
      
}

4、种草问题

【问题描述】

小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。

小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。

这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。

请告诉小明,k 个月后空地上哪些地方有草。

【输入格式】

输入的第一行包含两个整数 n, m。

接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。

接下来包含一个整数 k。

【输出格式】

输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。

【样例输入】

4 5

.g...

.....

..g..

.....

2

【样例输出】

gggg.

gggg.

ggggg

.ggg.

【评测用例规模与约定】

对于 30% 的评测用例,2 <= n, m <= 20。

对于 70% 的评测用例,2 <= n, m <= 100。

对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。

【解题思路】这是一个典型的bfs搜索问题,给n×m的字符矩阵,'g'表示种草,'.' 表示空地,每个月草都会向上、下、左、右扩展,然后再过一个月新长出来的草又去向上下左右扩展,直到k月。首先把草换一个字符#表示,然后找第一个月的草#,把#周围的空地都计为g,while循环,直到K月。

换一个字符#表示,然后找第一个月的草#,把#周围的空地都计为g,while循环,直到K月。

注:这题我自己试了好多实例都过了

#include<stdio.h>
#include<string.h>
char s[1100][1100];
int n,m;
void fn(int x,int y);
int main()
{
  int i,j,k;
  while(scanf("%d%d",&n,&m)!=EOF)
  {
    getchar();
    for(i=0;i<n;i++)
      scanf("%s",s[i]);
    scanf("%d",&k);
    while(k--)
    {
      for(i=0;i<n;i++)
        for(j=0;j<m;j++)
          if(s[i][j]=='g')//先把草换一个字符表示
            s[i][j]='#';
      for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
          if(s[i][j]=='#')//在矩阵中去寻找
            fn(i,j);
        }
    }
    for(i=0;i<n;i++)
      for(j=0;j<m;j++)
        if(s[i][j]=='#')
          s[i][j]='g';
    for(i=0;i<n;i++)
      printf("%s\n",s[i]);
  }
  return 0;
}
void fn(int x,int y)
{
  int i,j,k,tx,ty;
  int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
  for(i=0;i<4;i++)
  {
    tx=x+next[i][0];
    ty=y+next[i][1];
    if(tx<0||tx>n||ty<0||ty>m)
      continue;
    if(s[tx][ty]=='.')//上下左右遇到空地就计为草g
      s[tx][ty]='g';
  } 
}

5、奇怪的数列


【问题描述】

小明想知道,满足以下条件的正整数序列的数量:

1. 第一项为 n;

2. 第二项不超过 n;

3. 从第三项开始,每一项小于前两项的差的绝对值。

请计算,对于给定的 n,有多少种满足条件的序列。

【输入格式】

输入一行包含一个整数 n。

【输出格式】

输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。

【样例输入】

4

【样例输出】

7

【样例说明】

以下是满足条件的序列:

4 1

4 1 1

4 1 2

4 2

4 2 1

4 3

4 4

【评测用例规模与约定】

对于 20% 的评测用例,1 <= n <= 5;

对于 50% 的评测用例,1 <= n <= 10;

对于 80% 的评测用例,1 <= n <= 100;

对于所有评测用例,1 <= n <= 1000。

【解题思路】这个题看着简单其实很麻烦,不过要考虑50%的样例的话,就可以过,我猜测如果要过100%样例可能要用dp;

我第一次写的是利用模拟的思想:

//每次去保留满足条件的最后两个数
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
  int i,j,m,k,n,t,sum,l;
  int a[1100],b[1100],c[1100],d[1100];
  while(scanf("%d",&n)!=EOF)
  {
    sum=n;
    for(i=1;i<=n;i++)
      a[i]=i;
    k=1;
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
      {
        if(abs(n-a[i])>a[j])
        {
          c[k]=a[i];
          d[k++]=a[j];
          sum++;
        }   
      }
    t=k-1;
    while(t!=0)
    {
      k=1;
      for(i=1;i<=t;i++)
      {
        a[i]=c[i];
        b[i]=d[i];
      }
      for(i=1;i<=t;i++)
      {
        for(l=1;l<abs(a[i]-b[i]);l++)
        {
          c[k]=b[i];
          d[k++]=l;
          sum++;
        }
      }
      t=k-1;
    }     
    printf("%d\n",sum%10000);
  } 
  return 0;
}

最后优化一下,发现用递归的思想更简单:

//还是和刚刚一样的思想,保留满足条件的最后两个数,一直的不满足条件,递归结束
#include<stdio.h>
#include<math.h>
int fn(int a,int b);
int sum;
int main()
{
  int i,j,k,m,n;
  while(scanf("%d",&n)!=EOF)
  {
    sum=0;
    for(i=1;i<=n;i++)
      fn(n,i);
    printf("%d\n",sum%10000);
  }
  return 0;
}
int fn(int a,int b)
{
  int i;
  for(i=1;i<fabs(a-b);i++)
    fn(b,i);
  sum=(sum+1)%10000;  
}

6、晚会节目

【问题描述】

小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。

这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。

小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。

小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。

【输入格式】

输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。

第二行包含 n 个整数,依次为每个节目的好看值。

【输出格式】

输出一行包含 m 个整数,为选出的节目的好看值。

【样例输入】

5 3

3 1 2 5 4

【样例输出】

3 5 4

【样例说明】

选择了第1, 4, 5个节目。

【评测用例规模与约定】

对于 30% 的评测用例,1 <= n <= 20;

对于 60% 的评测用例,1 <= n <= 100;

对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。

【解题思路】这个题我的理解就是选择m个好看值大的节目,不过这m个好看的节目要考虑先后顺序输出。

意:这个题我用的是双重循环,只考虑过部分样例

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[110000],b[110000],c[110000],book[110000];
int main()
{
  int i,j,k,n,m,t;
  while(scanf("%d%d",&n,&m)!=EOF)
  {
    memset(book,0,sizeof(book));
    t=m;
    for(i=1;i<=n;i++)
    {
      scanf("%d",&a[i]);
      b[i]=a[i];
    }
    sort(b,b+n+1);
    k=n;
    for(i=1;i<=m;i++)
      c[i]=b[k--];
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=m;j++)
      {
        if(a[i]==c[j]&&book[c[j]]==0)
        {
          book[c[j]]=1;
          printf("%d",a[i]);
          if(t>1)
            printf(" ");
          t--;
          break;
        }
      }
    }
    printf("\n"); 
  }
  return 0;
}

相关文章
|
存储 人工智能 测试技术
十四届蓝桥杯模拟赛第三期(二)
十四届蓝桥杯模拟赛第三期
136 0
|
算法
十四届蓝桥杯模拟赛第三期(一)
十四届蓝桥杯模拟赛第三期
441 0
第14届蓝桥杯模拟赛 第2期
请找到一个大于 2022 的最小数,这个数转换成二进制之后,最低的 6 个二进制为全为 0 。请将这个数的十进制形式作为答案提交。
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第94场周赛
文章目录 第一题 AcWing 4870. 装物品 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4871. 最早时刻 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4872. 最短路之和 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
77 0
|
存储 人工智能 算法
【蓝桥杯集训·最后一次周赛】AcWing 第 97 场周赛
文章目录 第一题 AcWing 4944. 热身计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4945. 比大小 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4946. 叶子节点 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
129 0
|
JavaScript BI
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录 第一题 AcWing 4876. 完美数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4877. 最大价值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4878. 维护数组 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
86 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第 95 场周赛
文章目录 第一题 AcWing 4873. 简单计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4874. 约数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4875. 整数游戏 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
109 0
|
存储 算法
【蓝桥杯集训·每日一题】AcWing 3728. 城市通电
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 Prim算法
84 0
|
存储
【蓝桥杯集训·周赛】AcWing 第92场周赛
文章目录 第一题 AcWing 4864. 多边形 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4865. 有效类型 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4866. 最大数量 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
122 0
|
存储 人工智能
【蓝桥杯集训·周赛】AcWing 第93场周赛
文章目录 第一题 AcWing 4867. 整除数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4868. 数字替换 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4869. 异或值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
99 0