赞
踩
【问题描述】
小明对数位中含有 2、 0、 1、 9 的数字很感兴趣,在 1 到 40 中这样的数包括 1、 2、 9、 10 至 32、 39 和 40,共 28 个,他们的和是 574,平方和是 14362。
注意,平方和是指将每个数分别平方后求和。
请问,在 1 到 2019 中,所有这样的数的平方和是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
提示:如果你编写程序计算,发现结果是负的,请仔细检查自己的程序,不要怀疑考场的编程软件
【题目答案】:2658417853
【题目代码】
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
- public static void main(String[] args) {
-
- long sum = 0;//防止int类型数位不够
-
- for(int i = 1; i <= 2019; i++){
- for(int j = i; j > 0; j = j / 10){
-
- int c = j % 10;//将最末尾数字取出来
-
- if(c == 2 || c == 0 || c == 1 || c == 9){//如果数位包含2019
- sum += i * i;
- break;
- }
- }
- }
- System.out.print(sum);
- }
- }
【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题目答案】:4659
【题目分析】:一道很经典的动态规划题,如果使用分治递归会使时间复杂度过高
【题目代码】
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
- public static void main(String[] args) {
- int first = 1, second = 1, third = 1;
-
- int temp = 0;
- for(int i = 4; i <= 20190324; i++){
-
- temp = third;
- third = (first + second + third)%10000;
-
- first = second;
- second = temp;
- }
- System.out.print(third);
- }
- }
【问题描述】
下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。
- 010000
- 000100
- 001001
- 110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫,一共 10 步。其中 D、 U、 L、 R 分别表示向下、向上、向左、向右走。
对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
- 01010101001011001001010110010110100100001000101010
- 00001000100000101010010000100000001001100110100101
- 01111011010010001000001101001011100011000000010000
- 01000000001010100011010000101000001010101011001011
- 00011111000000101000010010100010100000101100000000
- 11001000110101000010101100011010011010101011110111
- 00011011010101001001001010000001000101001110000000
- 10100000101000100110101010111110011000010000111010
- 00111000001010100001100010000001000101001100001001
- 11000110100001110010001001010101010101010001101000
- 00010000100100000101001010101110100010101010000101
- 11100100101001001000010000010101010100100100010100
- 00000010000000101011001111010001100000101010100011
- 10101010011100001000011000010110011110110100001000
- 10101010100001101010100101000010100000111011101001
- 10000000101100010000101100101101001011100000000100
- 10101001000000010100100001000100000100011110101001
- 00101001010101101001010100011010101101110000110101
- 11001010000100001100000010100101000001000111000010
- 00001000110000110101101000000100101001001000011101
- 10100101000101000000001110110010110101101010100001
- 00101000010000110101010000100010001001000100010101
- 10100001000110010001000010101001010101011111010010
- 00000100101000000110010100101001000001000000000010
- 11010000001001110111001001000011101001011011101000
- 00000110100010001000100000001000011101000000110011
- 10101000101000100010001111100010101001010000001000
- 10000010100101001010110000000100101010001011101000
- 00111100001000010000000110111000000001000000001011
- 10000001100111010111010001000110111010101101111000
请注意在字典序中D<L<R<U。(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 maze.txt,内容与下面的文本相同)
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个字符串,包含四种字母 D、 U、 L、 R,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
【题目答案】:DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
【题目思路】:这道题是一道经典的遍历问题,如果使用深度优先搜索遍历,即使进行剪枝时间复杂度仍然较高,故使用广度优先搜索,只要设计叶子的遍历顺序为D、L、R、U,即可得到步数最少且字典序最小的答案。值得注意的是,要防止产生回路。
【题目代码】
- import java.util.*;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
-
- public static boolean[][] visit = new boolean[30][50];
-
- public static void main(String[] args) {
- for(int i = 0; i < 30; i++) {
- for(int j = 0; j < 50; j++) {
- visit[i][j] = false;
- }
- }
-
- //首先进行截取字符串
- String s = "01010101001011001001010110010110100100001000101010\r\n" +
- "00001000100000101010010000100000001001100110100101\r\n" +
- "01111011010010001000001101001011100011000000010000\r\n" +
- "01000000001010100011010000101000001010101011001011\r\n" +
- "00011111000000101000010010100010100000101100000000\r\n" +
- "11001000110101000010101100011010011010101011110111\r\n" +
- "00011011010101001001001010000001000101001110000000\r\n" +
- "10100000101000100110101010111110011000010000111010\r\n" +
- "00111000001010100001100010000001000101001100001001\r\n" +
- "11000110100001110010001001010101010101010001101000\r\n" +
- "00010000100100000101001010101110100010101010000101\r\n" +
- "11100100101001001000010000010101010100100100010100\r\n" +
- "00000010000000101011001111010001100000101010100011\r\n" +
- "10101010011100001000011000010110011110110100001000\r\n" +
- "10101010100001101010100101000010100000111011101001\r\n" +
- "10000000101100010000101100101101001011100000000100\r\n" +
- "10101001000000010100100001000100000100011110101001\r\n" +
- "00101001010101101001010100011010101101110000110101\r\n" +
- "11001010000100001100000010100101000001000111000010\r\n" +
- "00001000110000110101101000000100101001001000011101\r\n" +
- "10100101000101000000001110110010110101101010100001\r\n" +
- "00101000010000110101010000100010001001000100010101\r\n" +
- "10100001000110010001000010101001010101011111010010\r\n" +
- "00000100101000000110010100101001000001000000000010\r\n" +
- "11010000001001110111001001000011101001011011101000\r\n" +
- "00000110100010001000100000001000011101000000110011\r\n" +
- "10101000101000100010001111100010101001010000001000\r\n" +
- "10000010100101001010110000000100101010001011101000\r\n" +
- "00111100001000010000000110111000000001000000001011\r\n" +
- "10000001100111010111010001000110111010101101111000\r\n" ;
-
- String[] strList = s.split("\r\n");
- System.out.println(bfs(strList));
-
-
- }
-
- public static String bfs(String[] strList) {
-
-
- Queue<int[]> queue = new LinkedList<int[]>();
- Queue<String> route = new LinkedList<String>();//用来记录路径
-
- int[] pos = new int[2];
- pos[0] = 0;
- pos[1] = 0;
- queue.offer(pos);
- route.offer("");
-
- int[] dx = new int[] {0 ,-1, 1, 0};
- int[] dy = new int[] {1, 0, 0, -1};
- String[] dirc = new String[] { "D", "L", "R", "U"};//用来记录路径
-
- while(!queue.isEmpty()) {
- pos = queue.poll();
-
- String rStr = route.poll();
-
- int x = pos[0];
- int y = pos[1];
-
- visit[y][x] = true;
-
- if(x == 49 && y == 29) {
- return rStr;
- }
-
- for(int i = 0; i < 4; i++) {
- int newx = x + dx[i];
- int newy = y + dy[i];
-
- if(newx >= 0 && newy >= 0 && newx < 50 && newy < 30
- && strList[newy].charAt(newx) == '0'
- && visit[newy][newx] == false) {//如果新位置行的通
- int[] newPos = new int[]{newx, newy};
- queue.offer(newPos);
-
- //记录位置
- route.offer(rStr + dirc[i]);
- }
- }
- }
- return "NOT FOUND";
- }
-
- }
【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题目答案】:34
【题目思路】:送分题,手算即可。。。。。
【题目过程】:
【问题描述】
RSA 是一种经典的加密算法。它的基本加密过程如下。
首先生成两个质数 p, q,令 n = p · q,设 d 与 (p - 1) · (q - 1) 互质,则可找到 e 使得 d · e 除 (p - 1) · (q - 1) 的余数为 1。n, d, e 组成了私钥, n, d 组成了公钥。
当使用公钥加密一个整数 X 时(小于 n),计算 C = Xd mod n,则 C 是加密后的密文。当收到密文 C 时,可使用私钥解开,计算公式为 X = Ce mod n。例如,当 p = 5, q = 11, d = 3 时, n = 55, e = 27。若加密数字 24,得 243 mod 55 = 19。解密数字 19,得 1927 mod 55 = 24。
现在你知道公钥中 n = 1001733993063167141, d = 212353,同时你截获了别人发送的密文 C = 20190324,请问,原文是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:待更新
【题目描述】
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1, A2, · · · AN,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, · · · AN 。
【输出格式】
输出一个整数代表答案。
【样例输入】
7
1 6 5 4 3 2 1
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 100000,−100000 ≤ Ai ≤ 100000。
【示例代码】
- import java.util.Scanner;
- import java.util.*;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- //在此输入您的代码...
- int n = scan.nextInt();//获取数量
- //接着求取树的深度
-
- int depth = 1;
- long sum = 0;
- long max = Integer.MIN_VALUE;
- int maxDepth = 0;
-
- //接着遍历
- for(int i = 1; i <= n; i++) {
- sum += scan.nextInt();
-
- if(i == Math.pow(2, depth)-1 || i == n) {
- if(sum > max) {
- max = sum;
- maxDepth = depth;
- }
- sum = 0;//清空sum
- depth++;//到下一层
- }
- }
- System.out.print(maxDepth);
- scan.close();
-
- }
- }
【题目描述】
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优先缓存中。
【输入格式】
第一行包含 3 个整数 N、M 和 T 。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
【样例解释】
6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。
对于所有评测用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T ,1 ≤ id ≤ N。
【题目分析】:题目较为复杂,想要跑对全部用例并不容易,需要先按时间存储id,然后依次遍历统计,具体分析如下。
【题目代码】
- import java.util.Scanner;
- import java.util.*;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- while(scan.hasNext()){
- int N = scan.nextInt();//N条编号
- int M = scan.nextInt();//M条订单信息
- int T = scan.nextInt();
- int[] pro = new int[N+1];
- int[] last = new int[N+1];
-
- //声明一个map数组
- HashMap<Integer, Integer> arr[] = new HashMap[T+1];
- for(int i = 0; i <= T; i++) {
- arr[i] = new HashMap<Integer, Integer>();
- }
-
- int ts, idl;
- //将表单存储在Map中
- for(int i = 0; i < M; i ++) {
- ts = scan.nextInt();
- idl = scan.nextInt();
- arr[ts].put(idl, arr[ts].getOrDefault(idl, 0)+1);
- }
-
- HashSet<Integer> ans = new HashSet<Integer>();
-
- //开始统计
- for(int t = 0; t <= T; t++) {
- for(int id :arr[t].keySet()) {
- //现有的分数
- pro[id] = Math.max(0, pro[id] - (t - last[id] - 1));
- //如果小于3,去除优先级
- if(pro[id] <= 3 && ans.contains(id)) ans.remove(id);
- pro[id] += arr[t].get(id) * 2;
-
- //如果大于五, 则添加优先级
- if(pro[id] > 5 && !ans.contains(id)) ans.add(id);
- last[id] = t;//最后的时间
- }
- }
-
- //统计最后时间段
- for(int id = 1; id <= N; id++){
- if(last[id] != T){
- pro[id] = Math.max(0, pro[id] - (T - last[id]));
-
- if(pro[id] <= 3 && ans.contains(id)) ans.remove(id);
- }
- }
- System.out.print(ans.size());
- }
-
- //在此输入您的代码...
-
- scan.close();
- }
- }
【题目描述】
给定一个长度为 N 的数组 A = [A1, A2, · · · AN],数组中有可能有重复出现的整数。
现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改 A2, A3, · · · , AN。
当修改 Ai 时,小明会检查 Ai 是否在 A1 ∼ Ai−1 中出现过。如果出现过,则小明会给 Ai 加上 1 ;如果新的 Ai 仍在之前出现过,小明会持续给 Ai 加 1 ,直到 Ai 没有在 A1 ∼ Ai−1 中出现过。
当 AN 也经过上述修改之后,显然 A 数组中就没有重复的整数了。现在给定初始的 A 数组,请你计算出最终的 A 数组。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A1, A2, · · · , AN 。
【输出格式】
输出 N 个整数,依次是最终的 A1, A2, · · · , AN。
【样例输入】
5
2 1 1 3 4
【样例输出】
2 1 3 4 5
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ N ≤ 10000。
对于所有评测用例,1 ≤ N ≤ 100000,1 ≤ Ai ≤ 1000000。
【题目分析】:这题暴力解只能跑出3个用例,需要以空间换时间,可以跑出8个用例
【题目代码】
- import java.util.Scanner;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
- public static void main(String[] args) {
- Scanner sc=new Scanner(System.in);
- int n=sc.nextInt();
- int arr[]=new int[n];
- int ans[]=new int[n];
- int []cnt=new int[1000006];
- for(int i=0;i<n;i++){
- arr[i]=sc.nextInt();
- ans[i]=arr[i]+cnt[arr[i]];
- cnt[arr[i]]++;
- }
- boolean buf[]=new boolean[2000006];
- for(int i=0;i<ans.length;i++){
- while(buf[ans[i]]){
- ans[i]++;
- }
- buf[ans[i]]=true;
- }
- StringBuilder sb=new StringBuilder();
- for(int i=0;i<ans.length;i++){
- sb.append((i==0?"":" ")+ans[i]);
- }
- System.out.println(sb.toString());
- sc.close();
- }
- }
【题目描述】
糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种口味编号 1 ∼ M。
小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售。
幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。
给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。
【输入格式】
第一行包含三个整数 N、M 和 K。
接下来 N 行每行 K 这整数 T1, T2, · · · , TK,代表一包糖果的口味。
【输出格式】
一个整数表示答案。如果小明无法品尝所有口味,输出 −1。
【样例输入】
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
【样例输出】
2
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ N ≤ 20 。
对于所有评测样例,1 ≤ N ≤ 100,1 ≤ M ≤ 20,1 ≤ K ≤ 20,1 ≤ Ti ≤ M。
【题目分析】:暴力解可以跑出6个用例,传统动态规划只能跑出4个,需要使用状态压缩动态规划。
【题目代码】:
- import java.util.*;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
-
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- int N = scan.nextInt();
- int M = scan.nextInt();
- int K = scan.nextInt();
-
- int[] candy = new int[N];
-
- //仅用一维数组表示动态规划,实时进行状态更新和舍弃
- int[] dp = new int[1<<M];
-
- //初始化dp
- Arrays.fill(dp, 21);
-
- for(int i = 0; i < N; i++) {
- for(int j = 0; j < K; j++) {
- int a = scan.nextInt();
- int item = (1<<(a-1));
- candy[i] |= item;
- }
- dp[candy[i]] = 1;
- }
-
- //接下来是0-1背包问题的解题思路
- for(int i = 0; i < N; i++) {
- for(int j = 1; j < (1<<M); j++) {
-
- //在之前存在的结果和加上糖果的结果选择最小值
- dp[candy[i] | j] = Math.min(dp[candy[i] | j], dp[candy[i]] + dp[j]);
- }
- }
-
- if(dp[(1<<M)-1] == 21) {
- System.out.println(-1);
- }else
- System.out.println(dp[(1<<M)-1]);
-
-
- scan.close();
- }
- }
【题目描述】
给 n, m, k, 求 有 多 少 对 (i, j) 满 足 1 ≤ i ≤ n, 0 ≤ j ≤ min(i, m) 且 C j ≡
0(mod k),k 是质数。其中 C j 是组合数,表示从 i 个不同的数中选出 j 个组成
一个集合的方案数。
【输入格式】
第一行两个数 t, k,其中 t 代表该测试点包含 t 组询问,k 的意思与上文中相同。
接下来 t 行每行两个整数 n, m,表示一组询问。
【输出格式】
输出 t 行,每行一个整数表示对应的答案。由于答案可能很大,请输出答案除以 109 + 7 的余数。
【样例输入】
1 2
3 3
【样例输出】
1
【样例说明】
在所有可能的情况中,只有 C1 = 2 是 2 的倍数。
【样例输入】
2 5
4 5
6 7
【样例输出】
0
7
【样例输入】
3 23
23333333 23333333
233333333 233333333
2333333333 2333333333
【样例输出】
851883128
959557926
680723120
【数据规模和约定】
对于所有评测用例,1 ≤ k ≤ 108, 1 ≤ t ≤ 105, 1 ≤ n, m ≤ 1018,且 k 是质数。评测时将使用 10 个评测用例测试你的程序,每个评测用例的限制如下:
评测用例编号 t n, m k
1, 2 ≤ 1 ≤ 2000 ≤ 100
3, 4 ≤ 105 ≤ 2000 ≤ 100
5, 6, 7 ≤ 100 ≤ 1018 ≤ 100
8, 9, 10 ≤ 105 ≤ 1018 ≤ 108
【题目分析】:待更新
【题目代码】:待更新
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。