2020年第十一届蓝桥杯软件类校内模拟赛C/C++,B组(题目+题解)

2020年第十一届蓝桥杯校内模拟赛

  1. 填空题
    问题描述
      在计算机存储中,15.125GB是多少MB?
    答案提交
      这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
      
    15.125*1024
15488
  1. 填空题
    问题描述
      1200000有多少个约数(只计算正约数)。
    答案提交
      这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include 
using namespace std;
int main ()
{
     
	int N=1200000;
	int cnt=0;
	for (int i=1;i*i<=N;i++)
	{
     
		if (N%i==0)
		{
     
			if (N%i==i)
			{
     
				cnt=cnt+1;
			}else {
     
				cnt=cnt+2;
				
			}
		}
	}
	cout<<cnt<<endl;
	return 0;
  }

结果是 96

  1. 填空题
    问题描述
      在1至2019中,有多少个数的数位中包含数字9?
      注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。
    答案提交
      这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include 
using namespace std;
int main()
{
     
	int cnt=0;
	for (int i=1;i<=2019;i++)
	{
     
		bool ok=false;
		int N=i;
		while (N)
		{
     
			if (N%10==9)
			{
     
				ok=true;
				break;
			}
			N=N/10;
		}
		if (ok)
		{
     
			cnt++;
		 } 
	}
	cout<<cnt<<endl;
	return 0;
}

结果是544

  1. 填空题
    问题描述
      一棵包含有2019个结点的树,最多包含多少个叶结点?
    答案提交
      这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
2018
  1. 题目描述
    问题描述
      在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0   给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
    输入格式
      输入的第一行包含一个整数 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。
#include 
using namespace std;
int main ()
{
     
	int cnt=0;
	int n;
	cin>>n;
	int a[1100];
	for (int i=0;i<n;i++)
	{
     
		cin>>a[i];
	}
	for (int j=0;j<n;j++)
	{
     
		bool ok=false;
		for (int i=j-1;i>=0;i--)
		{
     
			for (int k=j+1;k<n;k++)
			{
     
				if (a[j]>a[i]&&a[j]<a[k])
				{
     
					cnt++;
					ok=true;
					break;
				}
			}
			if (ok)
			{
     
				break;
			}
		}
	}
	cout<<cnt<<endl;
	return 0;
	
}

一般我们的计算机一秒钟可以做的循环大概是10e8,这个题时间复杂度不会算就生成了1000个随机数试了下没有问题。

  1. 题目描述
    问题描述
      小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
      给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
      元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
    输入格式
      输入一行,包含一个单词,单词中只包含小写英文字母。
    输出格式
      输出答案,或者为yes,或者为no。
    样例输入
    lanqiao
    样例输出
    yes
    样例输入
    world
    样例输出
    no
    评测用例规模与约定
      对于所有评测用例,单词中的字母个数不超过100。
#include 
#include 
using namespace std;
int  main ()
{
     
	int cnt=0;
	char str[110];
	cin>>str;
	int len =strlen(str);
	bool ok=false;
	for (int i=0;i<len;i++)
	{
     
		if (!ok&&(str[i]!='a'&&str[i]!='e'&&str[i]!='i'&&str[i]!='o'&&str[i]!='u'))
		{
     
			ok=true;
			cnt++;
		}
		if (ok&&(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u'))
		{
     
			cnt++;
			ok=false;
		}
	}
	if (cnt==4)
	{
     
		cout<<"yes"<<endl;
	}else {
     
		cout<<"no"<<endl;
	}
	return 0;
}
  1. 题目描述
    问题描述
      一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
      给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
    输入格式
      输入的第一行包含一个整数 n。
    输出格式
      输出一行包含一个整数,表示答案。
    样例输入
    30
    样例输出
    26
    评测用例规模与约定
      对于 40% 的评测用例,1 <= n <= 1000。
      对于 80% 的评测用例,1 <= n <= 100000。
      对于所有评测用例,1 <= n <= 1000000。
#include 
using namespace std;
int main()
{
     
	int n;
	cin>>n;
	int cnt=0;
	for (int i=1;i<=n;i++)
	{
     
		int N=i;
		int k=10;
		bool ok=true;
		while (N)
		{
     
			if (N%10>k)
			{
     
				ok=false;
			}
			k=N%10;
			N=N/10;
			
		 } 
		 if (ok)
		 {
     
		 	cnt++;
		 	
		  } 
	 } 
	 cout<<cnt<<endl;
	 return 0;
	 
}
  1. 题目描述
    问题描述
      小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
      小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
      这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
      请告诉小明,k 个月后空地上哪些地方有草。
    输入格式
      输入的第一行包含两个整数 n, m。
      接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
      接下来包含一个整数 k。
    输出格式
      输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
    样例输入
    4 5

    2
    样例输出
    gggg.
    gggg.
    ggggg
    .ggg.
    评测用例规模与约定
      对于 30% 的评测用例,2 <= n, m <= 20。
      对于 70% 的评测用例,2 <= n, m <= 100。
      对于所有评测用例,2 <= n, m <= 1000,1 <= k <= 1000。
#include 
using namespace std;
char a[1100][1100];
char b[1100][1100];
int T = 0;
int n, m;
void f(int x, int y)
{
     
	int t = T;
	for (int t = 1; t <= T; t++)
	{
     
		for (int i = 0; i <= t; i++)
		{
     
			if ((x - i) >= 0 && (x - i) < n && (y - t + i) >= 0 && (y - t + i) < m)
			{
     
				b[x - i][y - t + i] = 'g';
			}
				
		}
		for (int i = 0; i <= t; i++)
		{
     
			if ((x - t + i) >= 0 && (x - t + i) < n && (y + i) >= 0 && (y + i) < m)
			{
     
				b[x - t + i][y + i] = 'g';
			}
				
		}
		for (int i = 0; i <= t; i++)
		{
     
			if ((x + i) >= 0 && (x + i) < n && (y + t - i) >= 0 && (y + t - i) < m)
			{
     
				b[x + i][y + t - i] = 'g';
			}
				
		}
		for (int i = 0; i <= t; i++)
		{
     
			if ((x + t - i) >= 0 && (x + t - i) < n && (y - i) >= 0 && (y - i) < m)
			{
     
				b[x + t - i][y - i] = 'g';
			}
				
		}
	}
	
}
int main()
{
     

	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
     
		for (int j = 0; j < m; j++)
		{
     
			cin>>a[i][j];
			
			b[i][j] = a[i][j];
		}
	}
	cin >> T;
	for (int i = 0; i < n; i++)
	{
     
		for (int j = 0; j < m; j++)
		{
     
			if (a[i][j] == 'g')
			{
     
				f(i, j);
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
     
		for (int j = 0; j < m; j++)
		{
     
			cout << b[i][j];
		}
		cout << endl;
	}
	return 0;
}

在纸上比划一下,很容易发现一圈一圈画棱形就好了,比较简单

  1. 题目描述
    问题描述
      小明想知道,满足以下条件的正整数序列的数量:
      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。
#include 
#include 
using namespace std;
int a[1100];
int cnt=0;
void dfs (int k,int t)
{
     
	if (k==0||(t!=1&&k<=1))
	{
     
		return ;
	}
	
	if (t==1)
	{
     
		for (int i=1;i<=k;i++)
		{
     
			a[t]=i;
			cnt++;
			dfs (abs(a[t-1]-a[t]),t+1);
		}
	 } 
	 if (t>1)
	 {
     
	 	for (int i=1;i<k;i++)
	 	{
     
	 		a[t]=i;
	 		cnt++;
	 		dfs (abs(a[t-1]-a[t]),t+1);
		 }
	 }
}
int main()
{
     
	int n;
	cin>>n;
	a[0]=n;
	dfs(n,1);
	cout<<cnt%10000<<endl;
	return 0;
	
 } 

写之前就已经明白注定不会过,果然只有50%的数据可以,
其实是有思路的,例如当abs(a[t-1]-a[t])等于4时那么后面就还有7种组合序列
只要找个数组存起来,那下次在遇到abs(a[t-1]-a[t])等于4时,就不用在搜一遍了
像这样把搜过一遍的都存起来,就可大大节约时间,应该就可以过了,
可惜这个思路的代码不会写,惭愧。。。。

  1. 题目描述
    问题描述
      小明要组织一台晚会,总共准备了 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。
    这题代码不保证正确性,偷分代码,能偷几分是几分
#include 
#include 
#include 
using namespace std;
int num[100100],num1[100100];
int cnt[100100];
bool cmp(int x,int y)
{
     
	return x>y;
}
int main ()
{
     
	memset(cnt,0,sizeof(cnt));
	int n,m;
	cin>>n>>m;
	for (int i=0;i<n;i++)
	{
     
		cin>>num[i];
		num1[i]=num[i];
	}
	sort(num,num+n,cmp);
	for (int i=0;i<m;i++)
	{
     
		cnt[num[i]]++;
	}
	int t=0;
	for (int i=0;i<n;i++)
	{
     
		if (cnt[num1[i]]!=0)
		{
     
			cnt[num1[i]]-=1;
			if (t==0)
			{
     
				cout<<num1[i];
			}else if (t!=0)
			{
     
				cout<<" "<<num1[i];
			}
			t+=1;
			if (t==m)
			{
     
				break;
			}
		}
	}
	cout<<"ok"<<endl;
	return 0;
	
}

随机生成100000个随机数试了一下,没有问题
关于sort排序:旧版 C++ 标准中仅要求它的平均时间复杂度达到O(nlogn),但 C++11 标准要求它的最坏时间复杂度是达到 O(nlogn),所以可以大胆用,不怕超时。

你可能感兴趣的:(2020年第十一届蓝桥杯软件类校内模拟赛C/C++,B组(题目+题解))