试题 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);
}
}
}
}