第十二届蓝桥杯大赛软件赛决赛Java 大学 C 组

试题 A: 整数范围

本题总分: 5
【问题描述】
8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0 ,则
一般能表示的最大值是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案 255
//这道题是求11111111转为10进制是多少的问题


public class Main {
	public static void main(String[] args) {
		System.out.println(Integer.parseInt("11111111", 2));
	}
}

试题 B: 带宽

本题总分: 5
【问题描述】
小蓝家的网络带宽是 200 Mbps ,请问,使用小蓝家的网络理论上每秒钟最
多可以从网上下载多少 MB 的内容。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
由于比特与字节的关系是8:1  所以转换是用200/8  的到结果  25MB
注意提交整数  整数  整数!!!

试题 C: 纯质数

本题总分: 10
【问题描述】
如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是: 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , · · ·
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如: 2 ,
3 , 5 , 7 , 23 , 37 都是纯质数,而 11 , 13 , 17 , 19 , 29 , 31 不是纯质数。当然 1 , 4 , 35
也不是纯质数。
请问,在 1 20210605 中,有多少个纯质数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
1903
public class Main {
	public static void main(String[] args) {
		long out = 0;//记录总个数
		for (int i = 1; i <= 20210605; i++) {
			if ((i+"").indexOf("1")==-1&&
			    (i+"").indexOf("4")==-1&&
			    (i+"").indexOf("6")==-1&& //首先判断当前数字中不能包含非质数数字
			    (i+"").indexOf("8")==-1&&
			    (i+"").indexOf("9")==-1&&
			    (i+"").indexOf("0")==-1) {
				if (f(i)) { //判断是否是质数
					out++;
					//System.out.println(i);
				}
			}
			if (i%10000==0) {
				System.out.println(i);//观察程序运行进度
			}
		}
		System.out.println(out);//最后结果
	}
	
	//判断是否是质数
	private static boolean f(int num) {
		for (int i = 2; i < num / 2; i++) {
			if (num%i==0) {
				return false;
			}
		}
		return true;
	}
}

试题 D: 完全日期

本题总分: 10
【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日
期。
例如: 2021 6 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16 ,而
16 是一个完全平方数,它是 4 的平方。所以 2021 6 5 日是一个完全日期。
例如: 2021 6 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16
是一个完全平方数。所以 2021 6 23 日也是一个完全日期。
请问,从 2001 1 1 日到 2021 12 31 日中,一共有多少个完全日
期?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
977
import java.util.Calendar;

public class Main {
	public static void main(String[] args) {
		long out = 0;//记录总个数
		Calendar n = Calendar.getInstance();
		n.clear();
		for (int i = 2001; i < 2022; i++) {//年份
			for (int j = 1; j <= 12; j++) {//月份
				n.set(i, j-1, 1);
				int max = n.getActualMaximum(Calendar.DAY_OF_MONTH);//获取当前月份最大天数
				for (int k = 1; k <= max; k++) {//日
					//System.out.println(i+""+j+""+k);
					if (f(Integer.parseInt(i+""+j+""+k))) {
						out++;
					}
				}
			}
		}
		System.out.println(out);//最后结果
	}
	
	//判断是否是完全日期
	private static boolean f(int num) {
		int n = 0;
		while (num>0) {
			n+=num%10;
			num/=10;
		}
		if (n==4||n==9||n==16||n==25) {//满足当前范围内日期的完全平方数只有4 9 16 25无需判断其余数字
			return true;
		}
		return false;
	}
}

试题 E: 最小权值

本题总分: 15
【问题描述】
对于一棵有根二叉树 T ,小蓝定义这棵树中结点的权值 W ( T ) 如下:
空子树的权值为 0
如果一个结点 v 有左子树 L , 右子树 R ,分别有 C ( L ) C ( R ) 个结点,则
W ( v ) = 1 + 2 W ( L ) + 3 W ( R ) + ( C ( L )) 2 C ( R )
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多
少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
这个题不太会  可以暴力出来 费时费力 所以就把考号写上了 /机智

试题 F: 大写

时间限制 : 1.0s
内存限制 : 512.0MB
本题总分: 15
【问题描述】
给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母
转换成大写字母后将字符串输出。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出转换成大写后的字符串。
【样例输入
1
LanQiao
【样例输出
1
LANQIAO
【评测用例规模与约定】
对于所有评测用例,字符串的长度不超过 100
//这道题出在这里  一个送分题?
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println(sc.next().toUpperCase());
		sc.close();
	}
}

试题 G: 123

时间限制 : 5.0s
内存限制 : 512.0MB
本题总分: 20
【问题描述】
小蓝发现了一个有趣的数列,这个数列的前几项如下:
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, ...
小蓝发现,这个数列前 1 项是整数 1 ,接下来 2 项是整数 1
2 ,接下来
3 项是整数 1 3 ,接下来 4 项是整数 1 4 ,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
【输入格式】
输入的第一行包含一个整数 T ,表示询问的个数。
接下来 T 行,每行包含一组询问,其中第 i 行包含两个整数
l i r i ,表示
询问数列中第 l i 个数到第 r i 个数的和。
【输出格式】
输出 T 行,每行包含一个整数表示对应询问的答案。
【样例输入】
3
1 1
1 3
5 8
【样例输出】
1
4
8
【评测用例规模与约定】
对于 10 % 的评测用例, 1 T
30 , 1 l i r i 100
对于 20 % 的评测用例, 1 T
100 , 1 l i r i 1000
对于 40 % 的评测用例, 1 T
1000 , 1 l i r i 10 6
对于 70 % 的评测用例, 1 T
10000 , 1 l i r i 10 9
对于 80 % 的评测用例, 1 T
1000 , 1 l i r i 10 12
对于 90 % 的评测用例, 1 T
10000 , 1 l i r i 10 12
对于所有评测用例, 1 T 100000 , 1 l i
r i 10 12

试题 H: 异或变换

时间限制 : 3.0s
内存限制 : 512.0MB
本题总分: 20
【问题描述】
小蓝有一个 01 s = s 1 s 2 s 3 · · · s n
以后每个时刻,小蓝要对这个 01 串进行一次变换。每次变换的规则相同。
对于 01 s = s 1 s 2 s 3 · · · s n ,变换后的 01
s
= s 1 s 2 s 3 · · · s n 为:
s 1
= s 1 ;
s
i
= s i 1 s i
其中 a b 表示两个二进制的异或,当
a
b 相同时结果为 0 ,当 a b
不同时结果为 1
请问,经过 t 次变换后的 01 串是什么?
【输入格式】
输入的第一行包含两个整数 n , t ,分别表示 01 串的长度和变换的次数。
第二行包含一个长度为 n 01 串。
【输出格式】
输出一行包含一个 01 串,为变换后的串。
【样例输入】
5 3
10110
【样例输出】
11010
【样例说明】
初始时为 10110 ,变换 1 次后变为 11101 ,变换 2 次后变为
10011 ,变换 3
次后变为 11010
【评测用例规模与约定】
对于 40 % 的评测用例, 1 n 100 , 1 t 1000
对于 80 % 的评测用例, 1 n 1000 , 1 t 10 9
对于所有评测用例, 1 n 10000 , 1 t 10 18

试题 I: 冰山

时间限制 : 5.0s
内存限制 : 512.0MB
本题总分: 25
【问题描述】
一片海域上有一些冰山,第 i 座冰山的体积为 V i
随着气温的变化,冰山的体积可能增大或缩小。第 i 天,每座冰山的变化
量都是 X i 。当 X i > 0 时,所有冰山体积增加 X i ;当 X i < 0 时,所有冰山体积减
X i ;当 X i = 0 时,所有冰山体积不变。
如果第 i 天某座冰山的体积变化后小于等于 0 ,则冰山会永远消失。
冰山有大小限制 k 。如果第 i 天某座冰山 j 的体积变化后 V j 大于 k ,则它
会分裂成一个体积为 k 的冰山和 V j k 座体积为 1 的冰山。
i 天结束前(冰山增大、缩小、消失、分裂完成后),会漂来一座体积为
Y i 的冰山( Y i = 0 表示没有冰山漂来)。
小蓝在连续的 m 天对这片海域进行了观察,并准确记录了冰山的变化。小
蓝想知道,每天结束时所有冰山的体积之和(包括新漂来的)是多少。
由于答案可能很大,请输出答案除以 998244353 的余数。
【输入格式】
输入的第一行包含三个整数 n , m , k ,分别表示初始时冰山的数量、观察的
天数以及冰山的大小限制。
第二行包含 n 个整数 V 1 , V 2 , · · · , V n ,表示初始时每座冰山的体积。
接下来 m 行描述观察的 m 天的冰山变化。其中第 i 行包含两个整数 X i , Y i
意义如前所述。
【输出格式】
输出 m 行,每行包含一个整数,分别对应每天结束时所有冰山的体积之和
除以 998244353 的余数。
【样例输入】
1 3 6
1
6 1
2 2
-1 1
【样例输出】
8
16
11
【样例说明】
在本样例说明中,用 [ a 1 , a 2 , · · · , a n ] 来表示每座冰山的体积。
初始时的冰山为 [1]
1 天结束时,有 3 座冰山: [1 , 1 , 6]
2 天结束时,有 6 座冰山: [1 , 1 , 2 , 3 , 3 , 6]
3 天结束时,有 5 座冰山: [1 , 1 , 2 , 2 , 5]
【评测用例规模与约定】
对于 40 % 的评测用例, n , m , k 2000
对于 60 % 的评测用例, n , m , k 20000
对于所有评测用例, 1 n , m 100000 ,
1 k 10 9 , 1 V i k , 0 Y i k ,
k X i k
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		long k = sc.nextInt();
		Queue<Long> que = new LinkedList<Long>();
		for (int i = 0; i < n; i++) {//初始时冰山状态
			que.add(sc.nextLong());
		}
		for (int i = 0; i < m; i++) {//
			long x = sc.nextLong();
			long y = sc.nextLong();
//			System.out.println(que);
			long sum = y;
			if (x != 0) {
				int len = que.size();//队列循环时长度会变化 单独记录一下
				for (int j = 0; j < len; j++) {
					long temp = que.poll() + x;//计算当前冰山状态 大于0再加入回去
					if (temp > 0) {
						sum += temp;
						if (temp > k) {
							que.add(k);//体积大于k添加一个k  其余为1
							for (int l = 0; l < temp - k; l++) {
								que.add(1l);
							}
						} else {
							que.add(temp);
						}
					}
				}
			}
			if (y != 0) {//判断有没有新冰山
				que.add(y);
			}
			System.out.println(sum%998244353l);
		}
//		System.out.println(que);
		sc.close();
	}

}

试题 J: 二进制问题

时间限制 : 1.0s
内存限制 : 512.0MB
本题总分: 25
【问题描述】
小蓝最近在学习二进制。他想知道 1 N
中有多少个数满足其二进制表示
中恰好有 K 1 。你能帮助他吗?
【输入格式】
输入一行包含两个整数 N K
【输出格式】
输出一个整数表示答案。
【样例输入】
7 2
【样例输出】
3
【评测用例规模与约定】
对于 30 % 的评测用例, 1 N
10 6 , 1 K
10
对于 60 % 的评测用例, 1 N
2 × 10 9 , 1 K 30
对于所有评测用例, 1 N
10 18 , 1 K 50
此方法不能通过所有测试数据  对于转换为二进制长度与k接近的时候  或者k较小的时候运行较快
import java.util.Scanner;

public class Main {
	public static long out = 0;
	public static int[] aa;
	public static long n;
	public static int k;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextLong();
		k = sc.nextInt();
		sc.close();
		aa = new int[Long.toString(n, 2).length()];//按照给定的n转为二进制的长度初始化aa数组
		f(k,0);
		System.out.println(out);
	}
	
	//递归方法 参数kk为还剩余几个1没有填写 index为当前该填写数字的数组下标位置
	private static void f(int kk,int index) {
		if (kk==0) {
			//当kk等于0代表填写完成了  此时将数组的数字拼成二进制字符串 转换为long  与输入的n进行判断
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < aa.length; i++) {
				sb.append(aa[i]);
			}
			if (Long.valueOf(sb.toString(), 2)<= n) {
				out++;
			}
		}else {
			//判断当前位置到结尾的数位数是否能够放下剩余1的个数
			if (aa.length-index<kk) {
				return;
			}else {
				aa[index] = 1;
				f(kk-1,index+1);
				aa[index] = 0;
				f(kk,index+1);
			}
		}
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值