【蓝桥杯31日冲刺】冲刺第17日(C++)

🌐前言🌐

  • 😃大家好啊,我是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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值