A: 进制
本题总分:
5
分
【问题描述】
8100178706957568
这个数在用
x
进制表示时
(
x
∈
[11
,
36]
)
,仅包含数字而
不包含字母,请问
x
是多少。比如
2588
用
16
进制表示为
a
1
c
,包含字母
a
和
c
。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
public class A {
public static void main(String[] args) {
long n=8100178706957568L;
c:for (int i = 11; i <=36 ; i++) {
String str=Long.toString(n,i);
char ch[]=str.toUpperCase().toCharArray();
for (int j = 0; j <ch.length ; j++) {
if (ch[j]<='Z'&&ch[j]>='A'){
continue c;
}
}
System.out.println(str+"\t"+i);//答案为32
}
}
}
B: 逆序对期望
本题总分:
5
分
【问题描述】
有一个数组,包含
1
到
n
这
n
个整数,初始为一个从小到大的有序排列
:
{
1
,
2
,
3
,
4
,
· · ·
,
n
}
。一次随机交换操作指:均匀随机选取两个位置
i
,
j
∈
[1
,
n
]
且
i
,
j
,然后交换数组中这两个位置上的数。那么对于
n
= 51
,对初始数组进行
两次随机交换操作之后,数组中的
逆序对
的数量的期望是多少个。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个实数,在提交答案时只填写这个实数,四舍五入保留两位小数,填写多余的
内容将无法得分。
C: 传送阵
时间限制
: 3.0s
内存限制
: 512.0MB
本题总分:
10
分
【问题描述】
小蓝在环球旅行时来到了一座古代遗迹,里面并排放置了
n
个传送阵,进
入第
i
个传送阵会被传送到第
a
i
个传送阵前,并且可以随时选择退出或者继续
进入当前传送阵。
小蓝为了探寻传送阵中的宝物,需要选择一个传送阵进入,然后连续进入
之后的传送阵。小蓝希望尽可能多地进入传送门以便搜索宝物,同时他可以使
用一次魔法,从某个传送阵
j
走到相邻的(第
j
−
1
或第
j
+ 1
个)传送阵,请
问小蓝最多能到达多少个不同的传送阵?一个传送阵可多次进入,但在计算答
案时只算一个。
【输入格式】
输入的第一行包含一个正整数
n
。
第二行包含
n
个正整数
a
1
,
a
2
,
· · ·
,
a
n
,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
5
2 1 5 4 3
【样例输出】
4
【样例说明】
小蓝的路径可以是:
1
→
2
→
3
→
5
。其中
2
→
3
使用魔法。
【评测用例规模与约定】
对于
20
%
的评测用例,
1
≤
n
≤
1000
;
对于所有评测用例,
1
≤
n
≤
10
6
,且
a
是
1
至
n
的一个排列。
仅提供参考
仅提供参考
仅提供参考
样例是通过的,但是其他不知道
import java.util.Scanner;
import java.util.HashSet;
public class C {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt() - 1;
}
int maxstep = dfs(a, new HashSet<>(), -1);
System.out.println(maxstep);
}
private static int dfs(int[] a, HashSet<Integer> vis, int prev) {
int maxstep = 0;
for (int i = 0; i < a.length; i++) {
if (!vis.contains(i)) {
vis.add(i);
int step = 1;
int next = a[i];
if (next != prev) {
step += dfs(a, vis, i);
}
if (i > 0 && !vis.contains(i - 1)) {
HashSet<Integer> tempVisited = new HashSet<>(vis);
tempVisited.add(i - 1);
step = Math.max(step, 1 + dfs(a, tempVisited, i));
}
if (i < a.length - 1 && !vis.contains(i + 1)) {
HashSet<Integer> tempvis = new HashSet<>(vis);
tempvis.add(i + 1);
step = Math.max(step, 1 + dfs(a, tempvis, i));
}
maxstep = Math.max(maxstep, step);
vis.remove(i);
}
}
return maxstep;
}
}
D: 前缀总分
内存限制
: 512.0MB
本题总分:
10
分
【问题描述】
给定
n
个由小写英文字母组成的字符串
s
1
,
s
2
,
· · ·
,
s
n
,定义前缀总分为
V
=
∑
i
<
j
P
(
s
i
,
s
j
)
,其中
P
(
s
i
,
s
j
)
表示
s
i
,
s
j
的最长公共前缀的长度。
小蓝可以选择其中一个字符串,并修改其中的一个字符。请问修改后前缀
总分最大为多少?
【输入格式】
输入的第一行包含一个正整数
n
。
接下来
n
行,每行包含一个字符串
s
i
。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3
aab
bbb
abb
【样例输出】
5
【样例说明】
将第二个字符串改为
abb
,得分为
P
(
aab
,
abb
)+
P
(
aab
,
abb
)+
P
(
abb
,
abb
) =
1 + 1 + 3 = 5
。
【评测用例规模与约定】
对于
20
%
的评测用例,
1
≤
n
≤
20
;
对于所有评测用例,
1
≤
n
≤
200
,
1
≤ |
s
i
| ≤
200
,其中
|
s
i
|
表示
s
i
的长度。
import java.util.Scanner;
public class D {
static String[] s;
static int max = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
s = new String[n];
for (int i = 0; i < s.length; i++) {
s[i] = sc.next();
}
int index_max = 0;
int index_min = 0;
int maxleng = 0;
int minleng = Integer.MAX_VALUE;
for (int i = 0; i < s.length; i++) {
if (maxleng <= s.length) {
maxleng = s[i].length();
index_max = i;
}
if (minleng > s.length) {
minleng = s[i].length();
index_min = i;
}
}
int sum = 0;
s[index_min] = s[index_max];
for (int i = 0; i < s.length - 1; i++) {
for (int j = i + 1; j < s.length; j++) {
sum += f(s[i], s[j]);
if (max<sum)
max=sum;
}
}
System.out.println(max);
}
// 计算两个字符串的最长公共前缀长度
public static int f(String s1, String s2) {
int minLength = Math.min(s1.length(), s2.length());
for (int i = 0; i < minLength; i++) {
if (s1.charAt(i) != s2.charAt(i)) {
return i;
}
}
return minLength;
}
}
E: 遗迹
时间限制
: 10.0s
内存限制
: 512.0MB
本题总分:
15
分
【问题描述】
小蓝找到了一个外星文明留下来的遗迹,遗迹大门的屏幕上有一个长度为
m
的字符串
t
和一个输入框,下面还有一个键盘,键盘为一个长度为
n
的字符
串
s
,由一个可以横向移动的指针来敲击键盘,指针可以向左移或向右移,不
能移出键盘。
小蓝需要在键盘字符串
s
上先指定指针初始位置然后不断移动指针的位置,
过程中通过敲击指针所在的字符来进行输入。然而,指针最多只能移动
L
的距
离,小蓝想输入一个尽可能长的一个
t
的前缀,请问他最多能输入多少位。
【输入格式】
输入的第一行包含三个正整数
n
,
m
,
L
,相邻整数之间使用一个空格分隔。
第二行包含一个长度为
n
的字符串
s
。
第三行包含一个长度为
m
的字符串
t
。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3 6 5
abc
acbbac
【样例输出】
5
【样例说明】
初始选择指针位于键盘
abc
上的
a
,输入
acbbac
这
6
个字符分别需要指针
移动
0
,
2
,
1
,
0
,
1
,
2
的距离,而最大移动距离为
5
,所以最多输入
5
个字符,移
动
0 + 2 + 1 + 0 + 1 = 4
的距离。
【评测用例规模与约定】
对于
20
%
的评测用例,
1
≤
m
≤
20
;
对于所有评测用例,
1
≤
n
≤
10
3
,
1
≤
m
≤
10
5
,
1
≤
L
≤
10
9
且
s
,
t
中只包
含小写字母,且
s
中一定包含所有
t
中出现过的字母,数据保证随机。
F: 送快递
时间限制
: 3.0s
内存限制
: 512.0MB
本题总分:
15
分
【问题描述】
小蓝正在一棵树上送快递,树上一共有
n
个结点,有
n
−
1
条长度为
1
的
边连接了这些结点。小蓝设置了
m
个机器人去完成
m
个送快递的任务,第
i
个
机器人会以最短路径从起点
s
i
走到目的地
t
i
。小蓝为了减少机器人移动的距
离,决定在这棵树上再加一条边,他想知道,在加上一条边之后,所有机器人
移动距离之和最小是多少?
【输入格式】
输入的第一行包含两个正整数
n
,
m
,用一个空格分隔。
接下来
n
−
1
行,第
i
行包含两个正整数
u
i
,
v
i
,用一个空格分隔,表示
u
i
和
v
i
之间有一条边。
接下来
m
行,第
i
行包含两个正整数
s
i
,
t
i
,用一个空格分隔,表示第
i
个
机器人的任务为从起点
s
i
走到目的地
t
i
。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3 2
1 2
1 3
1 2
2 3
【样例输出】
2
【样例说明】
加上边
<
2
,
3
>
后,两个机器人移动距离都为
1
,距离和为
2
。
【评测用例规模与约定】
对于
20
%
的评测用例,
1
≤
n
,
m
≤
20
;
对于所有评测用例,
1
≤
n
,
m
≤
300
,
1
≤
u
i
,
v
i
≤
n
,
1
≤
s
i
,
t
i
≤
n
。
G: 狡兔 k 窟
时间限制
: 3.0s
内存限制
: 512.0MB
本题总分:
20
分
【问题描述】
一只兔子名叫小蓝,它异常狡猾,在土中挖了若干洞窟并且设置了很多出
入口来应对紧急情况。它一共有
n
个通往地面的出入口,在地面上这
n
个出入
口之间由
n
−
1
条长度为
1
的双向通路连成一个连通图。第
i
个出入口属于第
c
i
个洞窟,因此小蓝可以在任意一个属于
c
i
的出入口从地面进入洞窟然后从任意
一个属于
c
i
的出入口跑出到达地面。
小蓝提出了
m
个逃跑路线,第
i
个路线希望从出入口
s
i
逃往
t
i
,它希望在
逃跑的过程中在地面上跑动的距离尽可能短,请为每条路线计算逃跑时在地面
上跑动的最短距离。
【输入格式】
输入的第一行包含两个正整数
n
,
m
,用一个空格分隔。
第二行包含
n
个正整数
c
1
,
c
2
,
· · ·
,
c
n
,相邻整数之间使用一个空格分隔。
接下来
n
−
1
行,第
i
行包含两个整数
u
i
,
v
i
,用一个空格分隔,表示地面
上的一条通路连接
u
i
和
v
i
。
接下来
m
行,第
i
行包含两个整数
s
i
,
t
i
,用一个空格分隔。
【输出格式】
输出
m
行,每行包含一个整数,依次表示每个询问的答案。
【样例输入】
6 3
1 3 2 1 2 3
1 2
1 3
2 4
2 5
3 6
2 6
3 2
4 3
【样例输出】
0
1
2
【评测用例规模与约定】
对于
20
%
的评测用例,
1
≤
n
,
m
,
c
i
≤
100
;
对于所有评测用例,
1
≤
n
,
m
,
c
i
≤
5000
,
1
≤
u
i
,
v
i
,
s
i
,
t
i
≤
n
。
H: 装修
时间限制
: 10.0s
内存限制
: 512.0MB
本题总分:
20
分
【问题描述】
小蓝需要一些木材来装修他的新房子,他找来了一棵有
n
个结点的树,每
条边有一个权值。他想要在树上砍下一些木材,每根木材由一条边和其两端的
结点构成,其权值为这条边的权值,所以一个结点最多属于一根木材。小蓝想
知道,在树上砍下的木材的权值和最大是多少?
【输入格式】
输入的第一行包含一个正整数
n
。
接下来
n
−
1
行,第
i
行包含三个整数
u
i
,
v
i
,
w
i
,相邻整数之间使用一个空
格分隔,表示结点
u
i
和
v
i
之间有一条权值为
w
i
的边。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
6
1 2 1
1 3 5
2 4 2
2 5 4
3 6 2
【样例输出】
9
【样例说明】
选择第
2
,
4
条边作为木材,边权值和为
5 + 4 = 9
【评测用例规模与约定】
对于
20
%
的评测用例,输入的树是一条链;
对于所有评测用例,
1
≤
n
≤
10
6
,
1
≤
u
i
,
v
i
≤
n
,
1
≤
w
i
≤
n
。