2019年第十届蓝桥杯C/C++研究生组

目录

    • 试题A:立方和(填空题5分)
    • 试题B:字串数字(5分)
    • 试题C:质数
    • 试题D:最短路(10分)
    • 试题E:RSA解密(15分)
    • 试题F:Fibonacci数列与黄金分割(15分)
    • 试题G:扫地机器人
    • 试题H:修改数组(20分)
    • 试题I:灵能传输(25分)
    • 试题J:空间跳跃(25分)

试题A:立方和(填空题5分)

  • 题目描述
    小明对数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39、40,共28个,它们的和是574,平方和是14362,立方和是400816.
    请问,在1到2019中,所有这样的数的立方和是多少?

  • 题目思路
    求数字的立方和很简单,题目却做出了一个限制,便是在1至2019中包含2、0、1、9四个数字之一的数。这个只需要一个取余运算便可进行判断。另外一个重要的点就是计算数据的溢出问题,因此选取double类型。

  • 题目代码

#include
using namespace std;
bool ifCon(int n){
	while(n){
		int temp=n%10;
		if(temp==2 || temp==0 || temp==1 || temp==9){
			return true;
		}
		n/=10;
	}
	return false;
}
int main() {
	long long sum=0;
	for(int i=1;i<=2019;i++){
		if(ifCon(i)){
			sum+=pow(i,3);
		}
	}
	cout<

试题B:字串数字(5分)

  • 问题描述
    小明用字母A对应数字1,B对应2,以此类推,用Z代表26.对应于27以上的数字,小明用两位或更长位的字符串来对应,例如AA对应27,AB对应28,AZ对应52,LQ对应329。
    请问,LANQIAO对应的数字是多少?

  • 思路
    简单来看,就是将10进制变成26进制,仿写26进制来做出答案。但此题是个填空题,使用计算器暴力解决是简单的。

  • 题目代码

#include
using namespace std;
int main(){
	string list="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	string x="LANQIAO";
	long long sum=0;
	int y=0; //保存次方
	for(int i=x.length()-1;i>=0;i--,y++){
		int temp=list.find(x[i])+1;
		sum+=temp*pow(26,y);
	}
	cout<

试题C:质数

  • 问题描述
    我们知道第一个质数是2,第二个质数是3,第三个质数是5······请你计算第2019个质数是多少?

  • 思想
    这道题就是计算质数,使用循环进行暴力计算,计算到2019个质数退出循环。

  • 题目代码

#include
using namespace std;
bool isPrime(int n)
{
    // 判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可
    for(int i=2; i

试题D:最短路(10分)

  • 问题描述
    如下图所示,G是一个无向图,其中蓝色边的长度是1,橘色边的长度是2,绿色边的长度是3,计算从A到S的最短距离是多少?6 A–>B–>J–>S
    2019年第十届蓝桥杯C/C++研究生组_第1张图片
  • 思路
    这个题是最短路径问题。简单的思路就是,一个数组,存储两点之间的距离,然后定义一个数组记录始点到终点的最短距离。例如:A->E,A->D,A->C,A->B,存储之间的距离,为1,1,1,2;然后E->I,E->D,E->H,D->I,D->H,D->G,D->E,D->C······距离分别为3,1,1,1,2,1,2,1,2·····依次存储,得出A->S的最短距离并输出。

试题E:RSA解密(15分)

  • 题目描述
    RSA是一种经典的加密算法。它的基本加密过程如下。
    首先生成两个大质数p,q, 令n = pq,设d与(p-1)(q-1)互质,则 可以找到e,使得de除以(p-1)(q-1)的余数为1。
      n,d,e组成了私钥,n,d构成了公钥。
      当使用公钥加密一个整数X时(X<=n-1),计算C = X^d mod n,则C是加密后的密文。
      当收到密文C时,可以使用私钥解开,计算公式为:X = C^e mod n。
      例如:当p = 5, q = 11, n = 55, e = 27。
      若加密数字24,得24^3 % 55 = 19。
      解密数字19,得19^27 % 55 = 24。
      现在你知道公钥中n = 1001733993063167141,d = 212353,同时,你截获了别人发送的密文C = 20190324,请问,原文是多少?

试题F:Fibonacci数列与黄金分割(15分)

  • 题目描述
    Fibonacci 数列是非常著名的数列:
    F[1] = 1,
    F[2] = 1,
    对于 i > 3,F[i] = F[i − 1] + F[i − 2]
    Fibonacci 数列有一个特殊的性质,前一项与后一项的比值,F[i]/F[i + 1], 会趋近于黄金分割。
    为了验证这一性质,给定正整数 N,请你计算 F[N]/F[N + 1],并保留 8 位 小数。
    输入
    一个正整数 N。(1 ≤ N ≤ 2000000000)
    输出
    F[N]/F[N + 1]。答案保留 8 位小数。
    样例输入
    2
    样例输出
    0.50000000
  • 题目分析
    看了一下题目数据范围,1 ≤ N ≤ 2000000000 ,很有可能会溢出。题目说Fibonacci数列的前一项与后一项的比值会趋近于黄金分割,并且结果保留 8 位小数,就产生了一个想法,会不会在某个 n 以后,计算的结果都一样呢?于是我们看一下循环1~50的计算结果。
  • 题目代码
#include
using namespace std;
long long F(long long n){
	if(n==1 || n==2){
		return 1;
	}
	else{
		return F(n-1)+F(n-2);
	}
}
int main(){
	long long  n;
	cin>>n;
	double x;
	if(n>20){
		x=F(20)*1.0/F(21);// 0.61803399
	}
	else{
		x=F(n)*1.0/F(n+1);
	}
	printf("%.8lf\n", x);
	cout<

试题G:扫地机器人

  • 【问题描述】
    小明公司的办公区有一条长长的走廊,由 N 个方格区域组成,如下图所示。
    在这里插入图片描述
    走廊内部署了 K 台扫地机器人,其中第 i 台在第 Ai 个方格区域中。
    已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净。
    请你编写一个程序,计算每台机器人的清扫路线,使得
    1.它们最终都返回出发方格,
    2.每个方格区域都至少被清扫一遍,
    3.从机器人开始行动到最后一台机器人归位花费的时间最少。
    注意多台机器人可以同时清扫同一方块区域,它们不会互相影响。
    输出最少花费的时间。
    在上图所示的例子中,最少花费时间是 6。第一台路线:2-1-2-3-4-3-2,清 扫了 1、2、3、4 号区域。第二台路线 5-6-7-6-5,清扫了 5、6、7。第三台路线 10-9-8-9-10,清扫了 8、9 和 10。
    【输入格式】
    第一行包含两个整数 N 和 K。 接下来 K 行,每行一个整数 Ai。
    【输出格式】
    输出一个整数表示答案。
    【样例输入】
    10 3
    5
    2
    10
    【样例输出】 6
    【评测用例规模与约定】
    对于 30% 的评测用例,1≤ K < N ≤10。 对于 60% 的评测用例,1≤ K < N ≤1000。 对于所有评测用例,1≤ K < N ≤100000,1≤ Ai ≤ N。
  • 思路:挺明显的一个二分题目。我们二分每个机器人的扫地范围,根据数学知识我们可以知道,当每个机器人清扫的面积相差不大时,耗时最少。假设二分的扫地范围是x,对于每一个扫地机器人,我们尽可能让它扫地的右边界大一些,也就是扫过的格子,没有必要绝对不扫。最后看扫地的右边界是否大于等于格子的边界,如果是的话,就说明符合条件,否则就不符合条件。
  • 代码如下:
#include
#define ll long long
using namespace std;

const int maxx=1e5+100;
int a[maxx];
int n,m;

inline bool check(int x)
{
	int sum=0;
	for(int i=1;i<=m;i++)
	{
		if(a[i]-x<=sum)
		{
			if(a[i]<=sum) sum=a[i]+x-1;
			else sum=sum+x;
		}
		else return 0;
	}
	return sum>=n;
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=1;i<=m;i++) scanf("%d",&a[i]);
		sort(a+1,a+1+m);
		int l=0,r=n,mid,ans;
		while(l<=r)
		{
			mid=l+r>>1;
			if(check(mid))
			{
				r=mid-1;
				ans=mid;
			}
			else l=mid+1;
		}
		cout<<(ans-1)*2<

试题H:修改数组(20分)

  • 【问题描述】
    给定一个长度为 N 的数组 A = [A1, A2, · · · AN],数组中有可能有重复出现的整数。
    现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改
    A2, A3, · · · , AN。
    当修改 Ai 时,小明会检查 Ai 是否在 A1 ~ Ai?1 中出现过。如果出现过,则小明会给 Ai 加上 1 ;如果新的 Ai 仍在之前出现过,小明会持续给 Ai 加 1 ,直到 Ai 没有在 A1 ~ Ai?1 中出现过。
    当 AN 也经过上述修改之后,显然 A 数组中就没有重复的整数了。现在给定初始的 A 数组,请你计算出最终的 A 数组。
    【输入格式】
    第一行包含一个整数 N。
    第二行包含 N 个整数 A1, A2, · · · , AN 。
    【输出格式】
    输出 N 个整数,依次是最终的 A1, A2, · · · , AN。
    【样例输入】
    5
    2 1 1 3 4
    【样例输出】
    2 1 3 4 5
    【评测用例规模与约定】
    对于 80% 的评测用例,1 ≤ N ≤ 10000。
    对于所有评测用例,1 ≤ N ≤ 100000,1 ≤ Ai ≤ 1000000。
  • 题目分析
    链接: 并查集.

试题I:灵能传输(25分)

2019年第十届蓝桥杯C/C++研究生组_第2张图片
2019年第十届蓝桥杯C/C++研究生组_第3张图片
题目分析
链接: 灵能传输.

试题J:空间跳跃(25分)

2019年第十届蓝桥杯C/C++研究生组_第4张图片
2019年第十届蓝桥杯C/C++研究生组_第5张图片
2019年第十届蓝桥杯C/C++研究生组_第6张图片

  • 题目代码
    链接: 空间跳跃.

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法,c语言)