第十五届蓝桥杯大赛软件赛省赛第二场_JAVA_C组

 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
  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值