“传智杯”初赛Java本科组赛题答案解析

2 篇文章 0 订阅

题目1【2星】

 

从古至今,各种末日谣言层出不穷。假如现在有这样一个谣言:天文学家在2014年6月1日,发现一颗行星,根据该行星的运行轨道,在3000天以后,该行星将撞击地球。现在,请编写Java程序计算,该谣言指向的“世界末日”是哪一天?

 

要求输出格式为:xxxx-xx-xx(例如:2015-12-12),不要添加任何其他多余文字。

 

输入描述:无

 

输出描述:

 

计算的结果日期,格式为:xxxx-xx-xx

 

输入样例:无

 

输出样例:

 

2015-12-12

 

参考代码:

 

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // 格式化
        Calendar c = Calendar.getInstance();
        c.set(2014, 5, 1); // 开始日期,注意月份是从0开始的
        c.add(Calendar.DAY_OF_YEAR, 3000);// 向后推3000天
        System.out.println(df.format(c.getTime()));
    }
}

 

题目2【4星】

 

由1到n的平方个数字组成的n×n阶方阵(n为任意给定的一个不小于3的奇数),它的每行、每列及对角线上的数字和都相等,称为n阶魔方阵。它的每行、每列及对角线上的数字和为n×(n² + 1) / 2。该方阵的排列方法是:

 

(1) 将数字1放在第一行的中间位置上,即(0,n/2)位置;

 

(2) 下一个数放在当前位置(i, j)的上一行(i-1)、下一列(j-1),即当前位置的右上方;如果出现以下情况,则修改填充位置:

 

① 若当前位置是第一行,下一个数放到最后一行,即把i-1修改为n-1;

 

② 若当前位置是最后一列,下一个数放在第一列,即把j-1修改为n-1;

 

③ 若下一个数要放的位置已经有数字,则下一个数放在当前位置的下一行,相同列。

 

(3) 重复以上过程,直到n²个数字不重复的填入方阵中。

 

根据以上描述,请使用Java语言,设计一个程序,输出n阶魔方阵。

 

魔方阵.png

 

输入描述:

 

一个大于等于3的奇数n,不建议太大,3-9即可

 

输出描述:

 

一个n*n的数字矩阵,每行的数字之间采用一个制表符"\t"分隔

 

输入样例:

 

3

 

输出样例:

 

8 1 6 
3 5 7 
4 9 2

 

样例代码:

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[][] magic = new int[n][n];
        int i = 0, j = n / 2;               // 第一个数位置
        for (int k = 1; k <= n * n; k++) {
            magic[i][j] = k;                // 当前位置
            if (k % n == 0) {               // 下一位有数字
                i = (i + 1) % n;            // 下一位在下一行
            } else {
                i = (i - 1 + n) % n;        // 在没到边界时,每次i减一,+n为了防止出现负数
                j = (j + 1) % n;            // 每n个数换一列
            }
        }

        // 输出二维数组
        for (int k = 0; k < magic.length; k++) {
            for (int l = 0; l < magic[k].length; l++) {
                System.out.print(magic[k][l] + "\t");  // 输出不换行,用制表符分隔
            }
            System.out.println();               // 换行
        }
    }
}

 

题目3【3星】

 

从前,某国王在处决500名死囚犯时突发奇想,想赦免其中的一个人,于是他把这500个死囚犯从1到500编号,都放到一片空地上,让大家手牵手组成一个大环。从1号开始报数,凡是报数为3的倍数的人就要被杀掉,每轮过后,剩下的人组成一个较小的环,继续报数(注意,上一轮最后一人报数后,下一轮的第一个人要继续往下报,而不是重新从1开始),直到剩下最后一个人为止。请编写程序计算,最终这个幸运的人是几号?

 

输入描述:无

 

输出描述:

 

一个整数,表示最终活下来的人员编号

 

输入样例:无

 

输出样例:

 

55

 

参考代码:

 

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
    for(int i = 1; i <= 500; i++) {
        list.add(i);
    }
    int count = 1;
    for (int i = 0; list.size() != 1; i++) {
            if (i == list.size()) {
                i = 0;
            }
            if (count % 3 == 0) {
                list.remove(i--);
            }
            count++;
    }
    System.out.println(list.get(0));
    }
}

 

题目4【3星】

 

给定一个正整数m(m最小是一个两位数),现在想从组成m这个数的数字中,去掉其中的n个数字(0 < n < m的位数),但保持每位上的数字相对顺序不变,使得剩余的数字组成的数是最大值。例如:

 

当m = 51342,n = 1;则结果应该是去掉数字1,剩余的值最大,为5342;

 

当m = 51342,n = 2;则结果应该是去掉数字1、3,剩余的值最大,为542;

 

当m = 51342,n = 3;则结果应该是去掉数字1、3、2,剩余的值最大,为54;

 

请使用Java语言编程,实现该算法。其中的m和n按要求输入正确范围内的数字即可,无需做合法校验。

 

输入描述:

 

第一行输入正整数m(m >= 10)
第二行输入去掉的数字个数n(0 < n < m的位数)

 

输出描述:

 

去掉n个数字后的最大值

 

输入样例:

 

51342
2

 

输出样例:

 

542

 

参考代码:

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long m = sc.nextLong();
        int n = sc.nextInt(); // 去除的数字个数
        String s = String.valueOf(m);
        for (int i = 0; i < n; i++) {
            int index = 0;
            for (int j = 0; j < s.length() - 1; j++) {
                if (s.charAt(j) < s.charAt(j + 1)) {
                    index = j; // 左边小于右边,就去掉这个左边的
                    break;
                }
                if (j == s.length() - 2) {
                    index = j + 1; // 去掉最小的
                }
            }
            if (index == s.length() - 1) {
                s = s.substring(0, s.length() - 1);
            } else {
                s = s.substring(0, index).concat(s.substring(index + 1));
            }
        }
        System.out.println(Integer.parseInt(s));
    }
}

题目5【4星】

 

小智拿到一个数列{a1, a2, ..., an},现在他想从这个数列中取出若干数,组成一个新的数列{ai1, ai2, ..., aim},其中索引i1, i2, ..., im保持递增,也就是说数列中各个数仍然保持在原数列中的先后顺序。并且在新数列中,对于任意索引ix > iy,都有aix > aiy,也就是说新数列是一个递增的子序列。

 

请编写程序,求出符合上述要求的最长递增子序列的长度。

 

例如数列[1, 3, 6, 7, 9, 4, 10, 5, 6],最长递增子序列为[1, 3, 6, 7, 9, 10],长度是6。

 

输入描述:

 

任意个数的整数,中间使用空格分隔

 

输出描述:

 

个整数,表示符合题目要求的最长子序列的长度

 

输入样例:

 

1 3 6 7 9 4 10 5 6

 

输出样例:

 

6

 

参考代码:

 

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] strs = line.split(" ");
        int[] arr = new int[strs.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(strs[i]);
        }
        int[] dp = new int[arr.length];
        dp[0] = 1;
        for (int i = 1; i < arr.length; i++) {
            // 关系状态方程:dp[i]=max{dp[j]+1(0<=j<i,arr[j]<arr[i])}
            int max = 0;
            for (int j = i; j >= 0; j--) {
                if (arr[j] < arr[i] && dp[j] > max) {
                    max = dp[j];
                }
            }
            dp[i] = max + 1;
        }
        Arrays.sort(dp);
        System.out.println(dp[dp.length - 1]);
    }
}

转载至: https://www.yuque.com/docs/share/121253a1-4d4f-4a45-88a6-83fe9e5e1fd1

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
第六届传智杯B组初赛是传智播客举办的一次IT技术竞赛的初赛阶段,旨在选拔出各高校优秀的程序设计人才。该比赛中,参赛者将面临多道编程题目,通过编写程序解决问题来展示他们的技术水平和创新能力。 在初赛中,参赛者需要在规定的时间内完成多道程序设计题目。这些题目可能涉及数据结构、算法、网络通信等方面的知识,要求参赛者具备扎实的编程基础和解决实际问题的能力。 参赛者需要在规定的时间内完成编程题目,并提交给评委进行评分。评委会根据答案的正确性、效率、代码的可读性等方面对参赛者的作品进行综合评判。最终,得分高的参赛者将进入下一轮比赛。 第六届传智杯B组初赛的目的是为了选拔出具备优秀编程能力的学生,为他们提供一个展示才华、学习交流的平台。参赛者不仅可以通过比赛锻炼自己的编程技巧,还可以结识其他优秀的参赛者,相互学习、切磋技艺。 在比赛过程中,参赛者还可以通过与其他选手交流,了解各种不同的编程思路和解题方法,不断提高自己的编程水平。同时,参赛者还有机会与业界的专家学者进行交流,了解最新的技术动态和发展趋势。 总之,第六届传智杯B组初赛是一次很有意义的编程竞赛,为各大高校的IT人才选拔提供了一次难得的机会。通过比赛,参赛者可以展现自己的才华,提升技术水平,同时也可以与其他优秀选手进行交流,共同进步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值