2019第十届蓝桥杯JAVA G组题解

蓝桥杯历年真题及解析.

试题 A: 立方和
本题总分:5 分
【问题描述】
小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包
括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574,平方和是 14362,
立方和是 400816。
请问,在 1 到 2019 中,所有这样的数的立方和是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

package JG2019;
//试题 A: 立方和
import java.math.BigInteger;

public class A {
	public static boolean check(int i){
		int x=0;
		while(i>0){
			x=i%10;
			i/=10;
			if(x==2||x==1||x==0||x==9){
				return true;
			}
		}
		return false;
	}
	public static void main(String[] args) {
		BigInteger sum=new BigInteger("0");
		for(int i=0;i<=2019;i++){
			if(check(i)){
				BigInteger ii=new BigInteger(String .valueOf(i));
				sum=sum.add(ii.multiply(ii).multiply(ii));
			}
		}
		System.out.println(sum);
	}
}

试题 B: 字串数字
本题总分:5 分
【问题描述】
小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27
以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。
请问 LANQIAO 对应的数字是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

package JG2019;
//试题 B: 字串数字
import java.math.BigInteger;

public class B {
	public static void main(String[] args) {
		String s="lanqiao";
		char c[]=s.toCharArray();
		BigInteger ans=new BigInteger("0");
		BigInteger b=new BigInteger("1");
		BigInteger bb=new BigInteger("26");
		for(int i=c.length-1;i>=0;i--){
			BigInteger x=new BigInteger(String.valueOf(c[i]-'a'+1));
			ans=ans.add(x.multiply(b));
			b=b.multiply(bb);
		}
		System.out.println(ans);
	}
}

试题 C: 质数
本题总分:10 分
【问题描述】
我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算
第 2019 个质数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

package JG2019;
//试题 C: 质数
public class C{
	public static boolean check(int n){
		for(int i=2;i<=Math.sqrt(n);i++){
			if((n/i)*i==n){
				return false;
			}
		}
		return true;
	}
	public static void main(String[] args) {
		int arr[]=new int [2019];
		boolean is[]=new boolean[100000];
		int p=0;
		for(int i=2;i<is.length;i++){
			if(is[i])continue;
			else if(check(i)){
				arr[p]=i;
				p++;
				if(p==2019)break;
				for(int j=i;j<is.length;j+=i){
					is[j]=true;
				}
			}
		}
		System.out.println(arr[2018]);
	}
}

试题 D: 最短路
本题总分:10 分
【问题描述】
如下图所示,G 是一个无向图,其中蓝色边的长度是 1、橘色边的长度是
2、绿色边的长度是 3。
则从 A 到 S 的最短距离是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。、

package JG2019;
//试题 D: 最短路
public class D {
	public static void main(String[] args) {
		System.out.println(3 * 2);
	}
}

试题 E: RSA 解密
本题总分:15 分
【问题描述】
RSA 是一种经典的加密算法。它的基本加密过程如下。
首先生成两个质数 p, q,令 n = p · q,设 d 与 (p p 1) · (q q 1) 互质,则可
找到 e 使得 d · e 除 (p p 1) · (q q 1) 的余数为 1。 n, d, e 组成了私钥,n, d 组成了公钥。
当使用公钥加密一个整数 X 时(小于 n),计算 C = Xd mod n,则 C 是加
密后的密文。
当收到密文 C 时,可使用私钥解开,计算公式为 X = Ce mod n。
例如,当 p = 5, q = 11, d = 3 时,n = 55, e = 27。
若加密数字 24,得 243 mod 55 = 19。
解密数字 19,得 1927 mod 55 = 24。
现在你知道公钥中 n = 1001733993063167141, d = 212353,同时你截获了
别人发送的密文 C = 20190324,请问,原文是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

package JG2019;
//试题 E: RSA 解密
public class E {
	public static long p, q, m, x, y, n = 1001733993063167141L;;

	public static void main(String[] args) {

		long d = 212353L;
		long c = 20190324L;
		p = 2;
		while (true) {
			if ((n / p) * p == n) {
				q = n / p;
				break;
			}
			p++;
		}
		m = (p - 1) * (q - 1);
		long[] ans = gcd(d, m);
		ans[1] = (ans[1] + m) % m;
		System.out.println(qpow(c, ans[1]));
	}

	public static long[] gcd(long a, long b) {
		long ans;
		long[] result = new long[3];
		if (b == 0) {
			result[0] = a;
			result[1] = 1;
			result[2] = 0;
			return result;
		}
		long[] temp = gcd(b, a % b);
		ans = temp[0];
		result[0] = ans;
		result[1] = temp[2];
		result[2] = temp[1] - (a / b) * temp[2];
		return result;
	}

	public static long qpow(long a, long b) {
		long ans = 1;
		while (b > 0) {
			if (b % 2 == 1)
				ans = qmul(ans, a);
			a = qmul(a, a);
			b /= 2;
		}
		return ans;
	}

	public static long qmul(long a, long b) {
		long ans = 0;
		while (b > 0) {
			if (b % 2 == 1) {
				ans += a;
				ans %= n;
			}
			a *= 2;
			a %= n;
			b /= 2;
		}
		return ans;
	}
}

试题 F: Fibonacci 数列与黄金分割
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
Fibonacci 数列是非常著名的数列:
F[1] = 1, F[2] = 1,
对于 i > 3,F[i] = F[i i 1] + F[i 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

package JG2019;
//试题 F: Fibonacci 数列与黄金分割
import java.util.Scanner;

public class F {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int arr[]=new int[40];
		arr[1]=1;
		arr[2]=1;
		for(int i=3;i<40;i++ ){
			arr[i]=arr[i-1]+arr[i-2];
		}
		if(n<39){
			System.out.println(String.format("%.8f",arr[n]/(double)arr[n+1]));
		}else{
			System.out.println(String.format("%.8f",arr[38]/(double)arr[39]));
		}
	}
}

试题 G: 扫地机器人
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小明公司的办公区有一条长长的走廊,由 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。
    试题 G: 扫地机器人 8
    第十届蓝桥杯大赛软件类省赛 Java 研究生组
    【输出格式】
    输出一个整数表示答案。
    【样例输入】
    10 3
    52
    10
    【样例输出】
    6
    【评测用例规模与约定】
    对于 30% 的评测用例,1 ≤ K < N ≤ 10。
    对于 60% 的评测用例,1 ≤ K < N ≤ 1000。
    对于所有评测用例,1 ≤ K < N ≤ 100000,1 ≤ Ai ≤ N。
package JG2019;
//************
//试题 G: 扫地机器人
import java.util.Arrays;
import java.util.Scanner;
 
public class G {
	public static int n;
	public static int arr[];
	public static int ans=Integer.MAX_VALUE;
	public static void main(String[] args) {
		Scanner sc=new Scanner (System.in);
		n=sc.nextInt();
		int k=sc.nextInt();
		arr=new int[k+1];
		for(int i=1;i<=k;i++){
			arr[i]=sc.nextInt();
		}
		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));
		dfs(1,0,0);
		System.out.println((ans-1)*2);
	}
	public static void dfs(int k,int max,int up){
		if(k==1){
			dfs(k+1,0,arr[1]);
		}
		else if(k==arr.length){
			max=max>(up+n-arr[k-1])?max:(up+n-arr[k-1]);
			ans=max>ans?ans:max;
		}
		else {
			if(arr[k]-arr[k-1]==0){
				dfs(k+1,max,up);
			}else
			for(int i=0;i<(arr[k]-arr[k-1]);i++){
				dfs(k+1,max>(up+i)?max:(up+i),arr[k]-arr[k-1]-i);
			}
		}
	}
}

试题 H: 修改数组
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
给定一个长度为 N 的数组 A = [A1, A2, · · · AN],数组中有可能有重复出现
的整数。
现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改
A2, A3, · · · , AN。
当修改 Ai 时,小明会检查 Ai 是否在 A1 ∼ Aii1 中出现过。如果出现过,则
小明会给 Ai 加上 1 ;如果新的 Ai 仍在之前出现过,小明会持续给 Ai 加 1 ,直
到 Ai 没有在 A1 ∼ Aii1 中出现过。
当 AN 也经过上述修改之后,显然 A 数组中就没有重复的整数了。
现在给定初始的 A 数组,请你计算出最终的 A 数组。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, · · · , AN 。
【输出格式】
输出 N 个整数,依次是最终的 A1, A2, · · · , AN。
【样例输入】
5
2 1 1 3 4
【样例输出】
2 1 3 4 5
试题 H: 修改数组 10
第十届蓝桥杯大赛软件类省赛 Java 研究生组
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ N ≤ 10000。
对于所有评测用例,1 ≤ N ≤ 100000,1 ≤ Ai ≤ 1000000。

package JG2019;
//试题 H: 修改数组
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class H {
	public static void main(String[] args) throws IOException {
		StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		in.nextToken();
		int n=(int) in.nval;
		int arr[]=new int [n];
		int i=0;
		int max=Integer.MIN_VALUE,min=Integer.MAX_VALUE;
		while (i<n) {
			in.nextToken();
			arr[i]= (int) in.nval;
			max=arr[i]>max?arr[i]:max;
			min=arr[i]<min?arr[i]:min;
			i++;
		}
		boolean buf[]=new boolean[max-min+1];
		int count=1;
		for(i=0;i<n;i++){
			if(!buf[arr[i]-min]){
				buf[arr[i]-min]=true;
			}else{
				boolean ok=false;
				for(int j=arr[i]-min;j<=max-min;j++){
					if(!buf[j]){
						buf[j]=true;
						arr[i]=j+min;
						ok=true;
						break;
					}
				}
				if(!ok){
					arr[i]=max+count;
					count++;
				}
			}
		}
		for(i=0;i<n;i++){
			out.print(arr[i]+" ");
		}
		out.flush();//刷新  
	}
}

试题 I: 组合数问题
时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
给 n, m, k,求有多少对 (i, j) 满足 1 ≤ i ≤ n, 0 ≤ j ≤ min(i, m) 且 Cji ≡
0(mod k),k 是质数。其中 Cji 是组合数,表示从 i 个不同的数中选出 j 个组成
一个集合的方案数。
【输入格式】
第一行两个数 t, k,其中 t 代表该测试点包含 t 组询问,k 的意思与上文中
相同。
接下来 t 行每行两个整数 n, m,表示一组询问。
【输出格式】
输出 t 行,每行一个整数表示对应的答案。由于答案可能很大,请输出答
案除以 109 + 7 的余数。
【样例输入】
1 2
3 3
【样例输出】
1
【样例说明】
在所有可能的情况中,只有 C12 = 2 是 2 的倍数。
【样例输入】
2 5
试题I: 组合数问题 12
第十届蓝桥杯大赛软件类省赛 Java 研究生组
4 5
6 7
【样例输出】
07
【样例输入】
3 23
23333333 23333333
233333333 233333333
2333333333 2333333333
【样例输出】
851883128
959557926
680723120
【数据规模和约定】
对于所有评测用例,1 ≤ k ≤ 108, 1 ≤ t ≤ 105, 1 ≤ n, m ≤ 1018,且 k 是质数。
评测时将使用 10 个评测用例测试你的程序,每个评测用例的限制如下:
评测用例编号 t n, m k 1, 2 ≤ 1 ≤ 2000 ≤ 100
3, 4 ≤ 105 ≤ 2000 ≤ 100
5, 6, 7 ≤ 100 ≤ 1018 ≤ 100
8, 9, 10 ≤ 105 ≤ 1018 ≤ 108
试题 I: 组合数问题 13
第十届蓝桥杯大赛软件类省赛 Java 研究生组
试题 J: 空间跳跃
时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分
【题目背景】
在游戏《星际争霸 II》中,战列巡航舰作为人类的终极作战武器,在后期
以及一些中期战术中发挥着空中堡垒的作用,其 “战术跳跃” 技能能让其在游戏
中期在敌军基地上空造成打击之后在血量较低时撤离,进行无战损骚扰,在人
类 vs 异虫对抗中经常用来压制异虫中期的发展。
【问题描述】
你在玩一个游戏,游戏中有 n 个地点和 m 条单向时空航道。每条时空航道
形如 (u, v,w, x),其中 u,v 表示这条时空航道的起点终点,w 表示通过这条航
道需要的时间(注意这个时间是现实当中游戏者的时间也是游戏内的时间),x
表示这条航道使用的频繁程度。时空航道不会成环,但可能会有两条航道的起
点相同同时终点也相同。游戏开始的时候,你的战列巡航舰到达了地点 1,每
当你到达一个地点的时候,战舰的电脑会按照每个起点为该地点的时空航道的
频繁程度随机选择一个航道并花费 w 单位时间到达该航道的终点。具体来说,
对于一个时间点 u,假如有 k 个起点为该地点的时空航道,他们的频繁程度分
别为 x1, x2, x3, · · · xk,那么选择第 i 个航道的概率就是 xi ∑kj=1 x j
。你的目的是在 L
单位游戏时间内到达一个没有任何以该地点为起点的时空航道的地点。当然你
可以在到达某一个地点时重新开始游戏,如果你重新开始这个游戏,你就能回
到游戏开始的那一刻(即 1 号地点)并重置游戏内的时间(即你又可以有 L 单
位的时间去跳跃了),你也可以在没有任何以该地点为起点的地点重新开始,且
无次数限制。你需要最小化你在现实中花费的时间。当然在你运气足够好的情
况下,你一定可以达成游戏目标。
保证一定有至少一条以 1 号地点为起点的航道。
请阅读样例以更清晰地理解题意。
试题 J: 空间跳跃 14
第十届蓝桥杯大赛软件类省赛Java研究生组
【输入格式】
第一行三个正整数 n,m,L。
接下来 m 行,每行四个正整数 u,v,w,x。
【输出格式】
一行一个浮点数表示答案,令你的答案为 a,标准答案为 b,如果满足
|aab|
max(1,b) ≤ 10쑘9(即绝对误差或者相对误差不超过 10唈9)即为正确。
【样例输入】
3 2 3
1 2 2 1
1 2 4 1
【样例输出】
6
【样例解释】
设答案为 Ans。 则 Ans = 12 × 2 + 12 × (Ans + 4)。
即有一半的可能性你可以直接完成游戏,否则你需要重新开始并再来一次。
解得 Ans = 6。
【样例输入】
4 4 7
1 2 2 7
1 3 4 6
2 4 6 3
3 4 3 2
试题J: 空间跳跃 15
第十届蓝桥杯大赛软件类省赛 Java 研究生组
【样例输出】
9.3333333333
【样例输入】
5 7 12
1 3 5 5
4 5 7 9
2 5 8 1
3 5 4 4
1 2 3 3
3 4 3 1
2 4 2 5
【样例输出】
11.3571428571
【样例输入】
见文件jump4.in。
【样例输出】
见文件jump4.ans。
【数据规模与约定】
对于所有评测用例,2 ≤ n ≤ 100,1 ≤ m ≤ 200,w, x ≤ 100,0 ≤ L ≤ 109,
保证输入的图无环,答案不超过 109。
评测时将使用 25 个评测用例测试你的程序,每个评测用例的限制如下:
试题 J: 空间跳跃 16
第十届蓝桥杯大赛软件类省赛 Java 研究生组
评测用例编号 n m w 特殊性质
1 ≤ 3 ≤ 3 ≤ 3 所有的时空航道起点都为 1 号地点
2 ≤ 3 ≤ 3 ≤ 100 无
3,4 ≤ 5 ≤ 4 = 1 无 5 ≤ 5 ≤ 8 = 1 无 6 ≤ 5 ≤ 8 ≤ 100 无
7,8,9,10 ≤ 20 = n n 1 ≤ 100 对于地点 u (2 ≤ u ≤ n) 有一条时空
航道 (v, u) 满足 1 ≤ v ≤ u u 1
11,12,13 ≤ 100 = n n 1 ≤ 100 对于地点 u (2 ≤ u ≤ n) 有一条时空
航道 (v, u) 满足 1 ≤ v ≤ u u 1
14,15 ≤ 100 = n n 1 ≤ 100 所有的时空航道起点都为 1 号地点
16,17 = 2 ≤ 200 ≤ 5 所有的时空航道起点都为 1 号地点
18 = 2 ≤ 200 ≤ 100 所有的时空航道起点都为 1 号地点
19,20,21 ≤ 20 ≤ 200 ≤ 100 无
22,23,24,25 ≤ 20 ≤ 200 ≤ 100 无

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王跃坤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值