蓝桥杯真题31日冲刺国一 | 每日题解报告 第十七天

大家好,我是泡泡,今天题不难,大家加油!

目录

一丶距离和

二丶扩散

三丶错误票据

总结:


一丶距离和

题目链接:距离和~~~~~~~~~~~~~

题目要求:

两个字母之间的距离定义为它们在字母表中位置的距离。例如 A 和 C 的距离为 2,L 和 Q 的距离为 5。

对于一个字符串,我们称字符串中两两字符之间的距离之和为字符串的内部距离。

例如:ZOO 的内部距离为 22,其中 Z 和 O 的距离为 11。

请问,LANQIAO 的内部距离是多少?

解题思路:

暴力签到,搞两个循环,每次让两个字母相减,记得加abs不然有负数。

#include <bits/stdc++.h>
using namespace std;
char s[7] = {'L','A','N','Q','I','A','O'};
int main()
{
  int num = 0;
  int len = strlen(s);
  for(int i=0;i<len;i++)
  {
    for(int j=i+1;j<len;j++)
    {
      num += abs(s[i] - s[j]);
    }
  }
  cout<<num;
  return 0;
}

二丶扩散

题目链接:扩 !! 散 !!

题目要求:

小蓝在一张无限大的特殊画布上作画。

这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。

小蓝在画布上首先点了一下几个点:(0,0),(2020,11),(11,14),(2000,2000)。

只有这几个格子上有黑色,其它位置都是白色的。

每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。

请问,经过 2020 分钟后,画布上有多少个格子是黑色的。

解题思路:

这是一道 bfs哦,坐标可能都是负数,所以向右,向上平移一下,这样的话相对位置不会变化,然后bfs即可!!!!

#include<bits/stdc++.h>
using namespace std;
bool a[10000][10000];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
long long ans;
struct node{
	int x,y,step;
};
void bfs() 
{
	queue<node>q;
	a[0+3000][0+3000]=1;
	a[2020+3000][11+3000]=1;
	a[11+3000][14+3000]=1;
	a[2000+3000][2000+3000]=1;
	q.push({0+3000,0+3000,0});
	q.push({2020+3000,11+3000,0});
	q.push({11+3000,14+3000,0});
	q.push({2000+3000,2000+3000,0});
	ans=4;
	while(q.size())
	{
		node temp=q.front();
		q.pop();
		if(temp.step==2020)
			continue;
		for(int i=0;i<4;i++)
		{
			int xx=temp.x+dir[i][0];
			int yy=temp.y+dir[i][1];
			if(!a[xx][yy])
			{
				ans++;
				a[xx][yy]=1;
				q.push({xx,yy,temp.step+1});
			}
		}
	}
}
int main()
{
	bfs();
	cout<<ans;
	return 0;
}

三丶错误票据

题目链接:超级简单的 错误票据

题目要求;

某涉密单位下发了某种票据,并要在年终全部收回。

每张票据有唯一的 ID 号。全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。

因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。

你的任务是通过编程,找出断号的 ID 和重号的 ID 。

假设断号不可能发生在最大和最小号。

解题思路:

吊题,一开始我用哈希表做的,结果错了,后面发现直接排序相减就可以了,因为数字是相连的如果相减大于1说明断号了,如果前后相等说明连号了,吊题不难!!!

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
int a[N];
int main()
{
    int n;
    cin >> n;
    int cnt = 0;
    while(scanf("%d",&a[cnt++]) != EOF);
    sort(a, a+cnt);
    int ans1, ans2;
    for(int i = 1; i < cnt; i++)
    {
        if(a[i] - a[i-1] > 1)
        {
          ans1 = a[i-1] + 1;
        } 
        if(a[i] == a[i-1])
        {
          ans2 = a[i];
        }
    }
    cout << ans1 << ' ' << ans2 << endl;
    return 0;
}

总结:

昨天有事情今天补上啦,一起加油!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloud、泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值