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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM