🌐前言🌐
- 😃大家好啊,我是FyHAng。今天是蓝桥杯31日冲刺的第17天。我将给大家带来今日三题的题解。一起加油!💪
一、距离和
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
两个字母之间的距离定义为它们在字母表中位置的距离。例如 A 和 C 的距离为 2,L 和 Q 的距离为 5。
对于一个字符串,我们称字符串中两两字符之间的距离之和为字符串的内部距离。
例如:ZOO 的内部距离为 22,其中 Z 和 O 的距离为 11。
请问,LANQIAO 的内部距离是多少?
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s = "LANQIAO";
int sum = 0;
for(int i = 0; i < s.size(); i++)
for(int j = i + 1;j < s.size(); j++)
sum += abs((int)(s[i] - s[j]));
cout << sum << endl;
return 0;
}
二、扩散
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:
- (0, 0), (2020, 11), (11, 14), (2000, 2000)。
只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 10000;
char g[N][N];
int dist[N][N];
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
void bfs()
{
queue<PII> q;
memset(dist, -1, sizeof dist);
q.push({3000, 3000}); dist[3000][3000]++;
q.push({5020, 3011}); dist[5020][3011]++;
q.push({3011, 3014}); dist[3011][3014]++;
q.push({5000, 5000}); dist[5000][5000]++;
while(q.size())
{
PII t = q.front();
q.pop();
if(dist[t.x][t.y] == 2020) return;
for(int i = 0; i < 4; i++)
{
int x = t.x + dx[i], y = t.y + dy[i];
if(x > 0 && x < N && y > 0 && y < N && g[x][y] == 'W' && dist[x][y] == -1)
{
g[x][y] = 'B';
dist[x][y] = dist[t.x][t.y] + 1;
q.push({x, y});
}
}
}
}
int main()
{
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
g[i][j] = 'W';
g[3000][3000] = 'B';
g[5020][3011] = 'B';
g[3011][3014] = 'B';
g[5000][5000] = 'B';
bfs();
int res = 0;
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(g[i][j] == 'B') res++;
cout << res << endl;
return 0;
}
三、错误票据
题目描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。
因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。
你的任务是通过编程,找出断号的 ID 和重号的 ID 。
假设断号不可能发生在最大和最小号。
输入描述
要求程序首先输入一个整数 N (N<100)表示后面数据行数。
接着读入 N 行数据。
每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于10^5 )。
输出描述
要求程序输出 1 行,含两个整数 m,n,用空格分隔。
其中,m 表示断号 ID,n 表示重号 ID。
输入输出样例
输入
2
5 6 8 11 9
10 12 9
输出
7 9
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n;
int a[N];
int main()
{
int cnt;
cin >> cnt;
string line;
getline(cin, line); // 忽略掉第一行的回车
while(cnt--)
{
getline(cin, line);
stringstream ssin(line);
while(ssin >> a[n]) n++;
}
sort(a, a + n);
int res1, res2;
for(int i = 1; i < n; i++)
if(a[i] == a[i - 1]) res2 = a[i];
else if(a[i] >= a[i - 1] + 2) res1 = a[i] - 1;
cout << res1 << ' ' << res2 << endl;
return 0;
}