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