2020年第十届蓝桥杯省赛B组校内赛(C/C++组)题目分析+赛后总结+题解答案

2019年第十届蓝桥杯省赛B组校内赛(C/C++组)题目分析+赛后总结+题解答案

问题描述
  在数列 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。

#include<iostream>
using namespace std;
const int N=1000;
int main()
{
	int a[N],n,i,sum=0,j,k;
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(i=0;i<n-2;i++)
	{
		for(j=i+1;j<n-1;j++)
			{
				for(k=j+1;k<n;k++)
					{
						if(a[i]<a[j] && a[j]<a[k])
						{	
							sum++;
							a[j]=0;
							break;
						}
					}
			}
	}
	cout<<sum<<endl;
	return 0;
}

问题描述
  给定两个正整数 n 和 m,请问在整数 1 至 n 中,各位数字的平方和为 m 的总共有多少个?
  例如,当 n=100,m=5 时,只有 12 和 21 各位数字的平方之和为 5,所以答案为 2。
输入格式
  输入的第一行包含两个整数 n 和 m,用一个空格分隔。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
100 5
样例输出
2
评测用例规模与约定
  对于 40% 的评测用例,1 <= n <= 1000,1 <= m <= 1000。
  对于所有评测用例,1 <= n <= 1000000,1 <= m <= 1000。

#include <bits/stdc++.h> 
using namespace std;
int main()
{
	int n,m,num=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int a=i,r=0;
		while(a)
		{
			r+=(a%10)*(a%10);
			a/=10;
		}
		if(r==m)num++;
	}
	cout<<num<<endl;
	return 0;
}

问题描述
  一般情况下,如果一个单词在段首,则第一个字母大写,后面的字母小写。
  给定一个单词,单词中可能包含大小写字母,请按第一个字母大写,后面字母小写的方式输出。
输入格式
  输入一行,包含一个单词,单词中只包含大写或小写英文字母。
输出格式
  输出单词在段首时的形式,第一个字母大写,其他字母小写。
样例输入
LanQiao
样例输出
Lanqiao
样例输入
cUp
样例输出
Cup
评测用例规模与约定

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main(){
    char c[100];
    while(gets(c)){
        int num=strlen(c);
        //注意非字母的特殊处理
        if(c[0]>='a'&&c[0]<='z')
            cout<<(char)('A'-'a'+c[0]);
        else
            cout<<c[0];
        for(int i=1;i<num;i++){
            if(c[i]>='A'&&c[i]<='Z'){
                cout<<(char)(c[i]-'A'+'a');
            }
            else
                cout<<c[i];
        }
        cout<<endl;
    }
}

问题描述
  对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
  例如,一个 4 行 5 列的螺旋矩阵如下:
  1 2 3 4 5
  14 15 16 17 6
  13 20 19 18 7
  12 11 10 9 8
输入格式
  输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。
  第二行包含两个整数 r, c,表示要求的行号和列号。
输出格式
  输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
样例输入
4 5
2 2
样例输出
15
评测用例规模与约定
  对于 30% 的评测用例,2 <= n, m <= 20。
  对于 70% 的评测用例,2 <= n, m <= 100。
  对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。

#include <bits/stdc++.h> 
using namespace std;
int main() {
	int m, n, t = 0;
	cin>>m>>n;
	vector<int> a(m*n);
	for (int i = 1; i <= m*n; i++)
		a[i-1]=i;
	vector<vector<int> > b(m, vector<int>(n));
	int level = m / 2 + m % 2;
	for (int i = 0; i < level; i++) 
	{
		for (int j = i; j <= n - 1 - i && t <= m*n - 1; j++)
			b[i][j] = a[t++];
		for (int j = i + 1; j <= m - 2 - i && t <= m*n - 1; j++)
			b[j][n - 1 - i] = a[t++];
		for (int j = n - i - 1; j >= i && t <= m*n - 1; j--)
			b[m - 1 - i][j] = a[t++];
		for (int j = m - 2 - i; j >= i + 1 && t <= m*n - 1; j--)
			b[j][i] = a[t++];
	}
	int xx,yy;
	cin>>xx>>yy;
	cout<<b[xx-1][yy-1]<<endl;
	return 0;
}

问题描述
  给定一个序列 a_1, a_2, …, a_n。其中 a_1 是最大的数,没有其他数与 a_1 相等。
  对于从第二个数开始的每个数 a_i,请找到位置在 a_i 之前且比 a_i 大的,位置上距离 a_i 最近的数 a_j。称 i-j 为 a_i 的前向距离。
  对于给定的序列,请求出所有数的前向距离之和。
输入格式
  输入的第一行包含一个整数 n,表示序列的长度。
  第二行包含 n 个正整数,为给定的序列。
输出格式
  输出一个整数,表示序列中所有数的前向距离之和。
样例输入
8
9 1 3 5 2 7 6 3
样例输出
14
样例说明
  序列中从第二项开始的前向距离依次为:
  1, 2, 3, 1, 5, 1, 1
  和为14。
数据规模和约定
  对于70%的评测用例,1 <= n <= 1000;
  对于所有评测用例,1 <= n <= 100000,a_1 <= 1000000。
  请注意答案可能很大,可能需要使用 long long 来保存。

#include <iostream>
#include <algorithm>  
#include <iomanip> 
#include <stack>
using namespace std;
typedef long long int ll; 
struct point{
 ll a;
 ll g;
} p[100005];

int main()
{
	stack<ll> s;
	ll n,d[100005],ans=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>p[i].a;
		d[p[i].a]=i;
		p[i].g=1;
		if(s.empty()||p[i].a<s.top())
		{
			s.push(p[i].a);
		}	
		while(p[i].a>s.top())
		{
			p[i].g+=p[d[s.top()]].g;
			s.pop();	
		}
		if(p[i].a<s.top()) s.push(p[i].a);
		ans+=p[i].g;
	}
	cout<<ans-1;
	
	return 0;
}




问题描述
  小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
  小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n 个。他们准备把自己带的树苗都植下去。
  然而,他们遇到了一个困难:有的树苗比较大,而有的位置挨太近,导致两棵树植下去后会撞在一起。
  他们将树看成一个圆,圆心在他们找的位置上。如果两棵树对应的圆相交,这两棵树就不适合同时植下(相切不受影响),称为两棵树冲突。
  小明和朋友们决定先合计合计,只将其中的一部分树植下去,保证没有互相冲突的树。他们同时希望这些树所能覆盖的面积和(圆面积和)最大。
输入格式
  输入的第一行包含一个整数 n ,表示人数,即准备植树的位置数。
  接下来 n 行,每行三个整数 x, y, r,表示一棵树在空地上的横、纵坐标和半径。
输出格式
  输出一行包含一个整数,表示在不冲突下可以植树的面积和。由于每棵树的面积都是圆周率的整数倍,请输出答案除以圆周率后的值(应当是一个整数)。
样例输入
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
样例输出
12
评测用例规模与约定
  对于 30% 的评测用例,1 <= n <= 10;
  对于 60% 的评测用例,1 <= n <= 20;
  对于所有评测用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。

题解

考虑DFS+回溯做法。

枚举出长度为 n{n}n 的二进制01串,第 i{i}i 位上的二进制位代表其是否种植。逐一统计出可种植的情况,并以此维护种植面积的最大值即可。
————————————————
版权声明:本文为CSDN博主「专科辣鸡在线丢人」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42815590/article/details/103544729
发布了9 篇原创文章 · 获赞 13 · 访问量 9519

猜你喜欢

转载自blog.csdn.net/ABV09876543210/article/details/103492483
今日推荐