练习题
P8772 [蓝桥杯 2022 省 A] 求和
# [蓝桥杯 2022 省 A] 求和
## 题目描述
给定 $n$ 个整数 $a_{1}, a_{2}, \cdots, a_{n}$, 求它们两两相乘再相加的和,即
$$
S=a_{1} \cdot a_{2}+a_{1} \cdot a_{3}+\cdots+a_{1} \cdot a_{n}+a_{2} \cdot a_{3}+\cdots+a_{n-2} \cdot a_{n-1}+a_{n-2} \cdot a_{n}+a_{n-1} \cdot a_{n}
$$
## 输入格式
输入的第一行包含一个整数 $n$ 。
第二行包含 $n$ 个整数 $a_{1}, a_{2}, \cdots a_{n}$ 。
## 输出格式
输出一个整数 $S$,表示所求的和。请使用合适的数据类型进行运算。
## 样例 #1
### 样例输入 #1
```
4
1 3 6 9
```
### 样例输出 #1
```
117
```
## 提示
对于 $30 \%$ 的数据, $1 \leq n \leq 1000,1 \leq a_{i} \leq 100$ 。
对于所有评测用例, $1 \leq n \leq 2\times10^5,1 \leq a_{i} \leq 1000$ 。
蓝桥杯 2022 省赛 A 组 C 题。
#include<bits/stdc++.h>
using namespace std;
const int MAX_INF = 0x3f3f3f3f;
const int MAXN = 200005;
int n, a[MAXN];
long long sum[MAXN], ans;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
for (int i = 1; i <= n-1; i++)
{
ans += a[i] * (sum[n] - sum[i]);
}
cout << ans << endl;
return 0;
}
P8680 [蓝桥杯 2019 省 B] 特别数的和
# [蓝桥杯 2019 省 B] 特别数的和
## 题目描述
小明对数位中含有 $2$、$0$、$1$、$9$ 的数字很感兴趣(不包括前导 $0$),在 $1$ 到 $40$ 中这样的数包括 $1$、$2$、$9$、$10$ 至 $32$、$39$ 和 $40$,共 $28$ 个,他们的和是 $574$。
请问,在 $1$ 到 $n$ 中,所有这样的数的和是多少?
## 输入格式
输入一行包含一个整数 $n$。
## 输出格式
输出一行,包含一个整数,表示满足条件的数的和。
## 样例 #1
### 样例输入 #1
```
40
```
### 样例输出 #1
```
574
```
## 提示
对于 $20\%$ 的评测用例,$1 \le n \le 10$。
对于 $50\%$ 的评测用例,$1 \le n \le 100$。
对于 $80\%$ 的评测用例,$1 \le n \le 1000$。
对于所有评测用例,$1 \le n \le 10000$。
蓝桥杯 2019 省赛 B 组 F 题。
#include <stdio.h>
int A(int m) {
while(m > 0) {
int d = m % 10;
if(d == 0 || d == 1 || d == 2 || d == 9) {
return 1;
}
m = m / 10;
}
return 0;
}
int main() {
int n, i;
int m = 0;
scanf("%d", &n);
for(i = 1; i <= n; i++) {
if(A(i)) {
m += i;
}
}
printf("%d\n", m);
return 0;
}
P8707 [蓝桥杯 2020 省 AB1] 走方格
# [蓝桥杯 2020 省 AB1] 走方格
## 题目描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 $1$ 至第 $n$ 行,从左到右依次为第 $1$ 至第 $m$ 列,每一个点可以用行号和列号来表示。
现在有个人站在第 $1$ 行第 $1$ 列,要走到第 $n$ 行第 $m$ 列。只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
## 输入格式
输入一行包含两个整数 $n$,$m$。
## 输出格式
输出一个整数,表示答案。
## 样例 #1
### 样例输入 #1
```
3 4
```
### 样例输出 #1
```
2
```
## 提示
$1\le n,m\le30$。
蓝桥杯 2020 第一轮省赛 A 组 G 题(B 组 H 题)。
#include<bits/stdc++.h>
using namespace std;
const int MAX_INF = 0x3f3f3f3f;
#define int long long
int n, m;
int mm[100][100];
int dfs(int x, int y)
{
if (x > n || y > m)
return 0;
else if (x == n && y == m)
return 1;
else if ((x % 2 == 0) && (y % 2 == 0))
return 0;
else if (mm[x][y] != -1)
return mm[x][y];
int ans = dfs(x + 1, y) + dfs(x, y + 1);
return mm[x][y]=ans;
}
signed main()
{
memset(mm, -1, sizeof(mm));
cin >> n >> m;
cout << dfs(1, 1);
return 0;
}
P8597 [蓝桥杯 2013 省 B] 翻硬币
# [蓝桥杯 2013 省 B] 翻硬币
## 题目背景
小明正在玩一个“翻硬币”的游戏。
## 题目描述
桌上放着排成一排的若干硬币。我们用 `*` 表示正面,用 `o` 表示反面(是小写字母,不是零),比如可能情形是 `**oo***oooo`,如果同时翻转左边的两个硬币,则变为 `oooo***oooo`。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
## 输入格式
两行等长字符串,分别表示初始状态和要达到的目标状态,每行长度小于 $1000$。
数据保证一定存在至少一种方案可以从初始状态和要达到的目标状态。
## 输出格式
一个整数,表示最小操作步数。
## 样例 #1
### 样例输入 #1
```
**********
o****o****
```
### 样例输出 #1
```
5
```
## 样例 #2
### 样例输入 #2
```
*o**o***o***
*o***o**o***
```
### 样例输出 #2
```
1
```
## 提示
source:蓝桥杯 2013 省 B 组 H 题
#include<bits/stdc++.h>
using namespace std;
const int MAX_INF = 0x3f3f3f3f;
string a, b;
int main()
{
cin >> a >> b;
int len = a.size(), s = 0;
for (int i = 0; i < len; i++)
{
if (a[i] != b[i])
{
a[i] = a[i] == 'o' ? '*' : 'o';
a[i + 1] = a[i + 1] == 'o' ? '*' : 'o';
s++;
}
}
cout << s << endl;
return 0;
}