2019年第十届蓝桥杯C组决赛

一.奇数倍数

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

请你找到最小的整数 X 同时满足:

  1. X 是 2019 的整倍数;
  2. X 的每一位数字都是奇数。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路:从2019开始按倍数枚举+判断即可。

#include <iostream>
using namespace std;

bool check(long long num)
{
  while(num)
  {
    if(((num % 10) & 1) == 0)
    {
      return false; 
    }
    num /= 10;
  }
  return true;
}

int main()
{
  // 请在此输入您的代码
  long long x = 2019;
  while(true)
  {
    if(check(x))
    {
      break;
    }
    x += 2019;
  }
  cout << x;
  return 0;
}

二.递增序列

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 4545 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。

例如,如下矩阵中

LANN
QIAO

有LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、ANLN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN 等 1313 个 递增序列。注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。

对于下面的 30 行 50 列的矩阵,请问总共有多少个递增序列?

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路:枚举起始位置,根据题目所说,只要从上之上、从左至右满足递增即可,那么行内向右看,列内向下看,斜对角线符合题意的方向是 左下、右上、右下。

#include <iostream>
using namespace std;
int main()
{
  string strs[30]={
    "VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG",
    "SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF",
    "ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA",
    "BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL",
    "YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH",
    "ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU",
    "XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR",
    "ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG",
    "MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA",
    "VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF",
    "GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC",
    "EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK",
    "PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW",
    "CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP",
    "RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS",
    "PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR",
    "JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL",
    "YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP",
    "HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN",
    "DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF",
    "LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW",
    "CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ",
    "IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI",
    "ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB",
    "HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP",
    "FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS",
    "VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ",
    "BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR",
    "RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY",
    "ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX"
  };
  int i, j, k, ans = 0, nx, ny;
  for(i = 0; i < 30; ++ i)
  {
    for(j = 0; j < 50; ++ j)
    {
      // 枚举起点
      //查看同一行
      for(k = j + 1; k < 50; ++ k)
      {
        if(strs[i][j] < strs[i][k])
        {
          ++ ans;
        }
      }
      //查看同一列
      for(k = i + 1; k < 30; ++ k)
      {
        if(strs[i][j] < strs[k][j])
        {
          ++ ans;
        }
      }
      //左下
      nx = i + 1;
      ny = j - 1;
      while(nx < 30 && ny >= 0)
      {
        if(strs[i][j] < strs[nx][ny])
        {
          ++ ans;
        }
        ++ nx;
        -- ny;
      }
      //右上
      nx = i - 1;
      ny = j + 1;
      while(nx >= 0 && ny < 50)
      {
        if(strs[i][j] < strs[nx][ny])
        {
          ++ ans;
        }
        -- nx;
        ++ ny;
      }
      //右下
      nx = i + 1;
      ny = j + 1;
      while(nx < 30 && ny < 50)
      {
        if(strs[i][j] < strs[nx][ny])
        {
          ++ ans;
        }
        ++ nx;
        ++ ny;
      }
      
    }
  }
  cout << ans;
  return 0;
}

3.平方拆分

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

将 2019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方法?

注意交换顺序视为同一种方法,例如 13^2 + 25^2 + 35^2 = 2019 与 13^2 + 35^2 +25^2 = 2019 视为同一种方法。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路:变种的0-1背包问题,dp[num] += dp[num - i * i]。

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
  int num, sum, target, dp[2030];
  memset(dp, 0, sizeof(dp));
  dp[0] = 1;
  for(num = 1; (target = num * num) <= 2019; ++ num)
  {
    for(sum = 2019; sum >= target; -- sum)
    {
      dp[sum] += dp[sum - target];
    }
  }
  cout << dp[2019];
  return 0;
}

四.切割

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

在 4 × 4 的方格矩阵中画一条直线。则直线穿过的方格集合有多少种不同的可能?

这个里直线穿过一个方格当且仅当直线将该方格分割成面积都大于 0 的两部分。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

思路:计算几何问题。

1.枚举被穿过的点的集合,复杂度为O(2^16)。

2.枚举直线y=ax+b。

五.序列求和

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 S_t​ 。

例如 S_1 = 1, S_2 = 2, S_3 = 4, S_4 = 6,⋅⋅⋅ 。

现在小明想知道,前 60 个 S_i​ 的和是多少?即 S_1 + S_2 + · · · + S_60​ 是多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

六.最长子序列

题目描述

我们称一个字符串 S 包含字符串 T 是指 T 是 S 的一个子序列,即可以从字符串 S 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 T 完全一样。

给定两个字符串 S 和 T,请问 T 中从第一个字符开始最长连续多少个字符被 S 包含?

输入描述

输入两行,每行一个字符串。第一行的字符串为 S,第二行的字符串为 T。两个字符串均非空而且只包含大写英文字母。

其中,1≤∣T∣≤∣S∣≤1000。

输出描述

输出一个整数,表示答案。

输入输出样例

示例

输入

ABCDEABCD
AABZ

输出

3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

思路:注意本题说的是T的串要匹配也必须是从头开始匹配,因此这不是一个最长公共子序列问题。正解为双指针法+贪心,如果S串目前可以和T匹配,则直接匹配上,因为这样才能预留更多的字符与T的剩余部分进行匹配。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string str_one, str_two;
  cin >> str_one >> str_two;
  int n = str_one.length(), m = str_two.length(), p_one = 0, p_two = 0;
  while(p_one < n && p_two < m)
  {
    if(str_one[p_one] == str_two[p_two])
    {
      ++ p_two;
    }
    ++ p_one;
  }
  cout << p_two;
  return 0;
}

七.数正方形

题目描述

在一个 N×N 的点阵上,取其中 4 个点恰好组成一个正方形的 4 个顶点,一共有多少种不同的取法?

由于结果可能非常大,你只需要输出模 10^9 + 7 的余数。

如上图所示的正方形都是合法的。

输入描述

输入包含一个整数 (2≤N≤106)。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

4

输出

20

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

思路:穷举可能的状态再进行判断。

1.直接枚举四个点,判断是否是正方形。

2.要构成正方形,只需要四条边首位接续相连,并且长度相等且互相垂直即可。垂直条件很好达成,可以利用向量的思想,假设点A、B、C构成两条线AB、BC,若AB=(x,y),则BC=(y,-x)即可。(当然也可以是BC=(-y,x),对应了不同的方向)用DFS进行状态的穷举即可,注意去重。

八.矩阵计数

题目描述

一个 N×M 的方格矩阵,每一个方格中包含一个字符 O 或者字符 X。

要求矩阵中不存在连续一行 3 个 X 或者连续一列 3 个 X。

问这样的矩阵一共有多少种?

输入描述

输入一行包含两个整数 N,M (1≤N,M≤5)。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

2 3

输出

49

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

思路:DFS,在x>=3或y>=3时判断条件进行剪枝。

#include<bits/stdc++.h>
using namespace std;

char grid[10][10];

bool vaild(int x, int y)//是否可以在这个位置放置'X'
{
	if(x >= 3)
	{
		if(grid[x - 1][y] == 'X' && grid[x - 2][y] == 'X')
		{
			return false;
		}
	}
	if(y >= 3)
	{
		if(grid[x][y - 1] == 'X' && grid[x][y - 2] == 'X')
		{
			return false;
		}
	}
	return true;
}

void DFS(int x, int y, int& N, int& M, int& ans)
{
  //cout << x << " " << y << endl;
	if(x == N + 1)
	{
		++ ans;
    return;
	}
	int nx, ny; 
	if(y == M)
	{
		nx = x + 1;
		ny = 1;
	} 
	else
	{
		nx = x;
		ny = y + 1; 
	} 
	if(vaild(x, y))
	{
		grid[x][y] = 'X';
		DFS(nx, ny, N, M, ans);
	}
	grid[x][y] = 'O';
	DFS(nx, ny, N, M, ans);
}

int main()
{
	int N, M, ans = 0;
	cin >> N >> M;
	char grid[N + 5][M + 5];
	DFS(1, 1, N, M, ans); 
  cout << ans;
	return 0;
} 

九.大胖子走迷宫

题目描述

小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×1 的面积,小明要占用 5×5 的面积。

由于小明太胖了,所以他行动起来很不方便。当玩一些游戏时,小明相比小伙伴就吃亏很多。

小明的朋友们制定了一个计划,帮助小明减肥。计划的主要内容是带小明玩一些游戏,让小明在游戏中运动消耗脂肪。走迷宫是计划中的重要环节。

朋友们设计了一个迷宫,迷宫可以看成是一个由 n×n 个方阵组成的方阵,正常人每次占用方阵中 1×1 的区域,而小明要占用 5×5 的区域。小明的位置定义为小明最正中的一个方格。迷宫四周都有障碍物。

为了方便小明,朋友们把迷宫的起点设置在了第 3 行第 3 列,终点设置在 了第 n−2 行第 n−2 列。

小明在时刻 0 出发,每单位时间可以向当前位置的上、下、左、右移动单位 1 的距离,也可以停留在原地不动。小明走迷宫走得很辛苦,如果他在迷宫里面待的时间很长,则由于消耗了很多脂肪,他会在时刻 k 变成一个胖子,只占用 3×3 的区域。如果待的时间更长,他会在时刻 2k 变成一个正常人,只占用 1×1 的区域。注意,当小明变瘦时迷宫的起点和终点不变。

请问,小明最少多长时间能走到迷宫的终点。注意,小明走到终点时可能瘦了也可能没有变瘦。

输入描述

输入的第一行包含两个整数 n,k (1≤n≤300,1≤k≤1000)。

接下来 n 行,每行一个由 n 个字符组成的字符串,字符为 + 表示为空地, 字符为 \* 表示为阻碍物。

输出描述

输出一个整数,表示答案。

输入输出样例

示例

输入

9 5
+++++++++
+++++++++
+++++++++
+++++++++
+++++++++
\*\*\*+\*\*\*\*\*
+++++++++
+++++++++
+++++++++

输出

16

 

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

十.估计人数

题目描述

给定一个 N×M 的方格矩阵,矩阵中每个方格标记 0 或者 1 代表这个方格 是不是有人踩过。

已知一个人可能从任意方格开始,之后每一步只能向右或者向下走一格。走了若干步之后,这个人可以离开矩阵。这个人经过的方格都会被标记为 1,包括开始和结束的方格。注意开始和结束的方格不需要一定在矩阵边缘。

请你计算至少有多少人在矩阵上走过。

输入描述

输入第一行包含两个整数 N、M。

以下 N 行每行包含 M 个整数 (0/1),代表方格矩阵。

其中,1≤N,M≤20,标记为 1 的方格不超过 200 个。

输出描述

输出一个整数代表答案。

输入输出样例

示例

输入

5 5
00100
11111
00100
11111
00100

输出

3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

思路:本题要求计算至少有多少人,由于每个人只能向右向下走,因此实际上只要我们知道了每个人可能的位置,让他们尽可能走多一点路,就可以知道至少多少人了。由于每个人只能向右或者向下,因此我们贪心的顺序应该是第一行、第一列、第二行、第二列。。。这样既可以不重不漏也可以让每个人走尽可能多的步数。实际上就是将矩阵做如下分解。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第十届蓝桥杯人物相关性题目是一道经典的编程问题,要求我们在给定的人物关系图中,判断两个人物之间是否存在一条关系链,即判断两个人物是否直接或间接地相关。 在这道题目中,我们可以使用图的搜索算法来解决问题。一种常见的算法是深度优先搜索(DFS),另一种是广度优先搜索(BFS)。 大概的思路是:首先,我们需要构建人物关系图,可以通过邻接矩阵、邻接表等数据结构来存储图的信息。然后,我们选择一个起始节点,从该节点开始进行搜索。如果在搜索的过程中找到了目标节点,即两个人物之间存在直接关系,那么我们可以结束搜索并返回结果。如果没有找到目标节点,则需要继续深入搜索,或者在广度搜索中扩展搜索队列。如果最终搜索完整个图都没有找到目标节点,那么可以判定两个人物之间不存在关系链。 具体实现时,可以使用递归或者栈来实现DFS,使用队列来实现BFS。在DFS中,我们可以利用函数的递归调用来实现深度搜索;在BFS中,我们可以通过队列不断地将待搜索节点加入队列,实现广度搜索。 总的来说,第十届蓝桥杯人物相关性题目考察了对图的数据结构和搜索算法的掌握程度。需要我们理解并实现图的构建和搜索过程,进而判断两个人物之间的相关性。这道题目不仅考察了编程基础知识,也锻炼了问题分析和解决能力,是一道非常有挑战性的编程题目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值