赞
踩
本题总分:5 分
【问题描述】 在同一天中,从上午6 点13 分22 秒到下午14 点36 分20 秒,钟表上的 分针和秒针一共重合了多少次? 注意时针、分针、秒针都围绕中心做匀速运动。
【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
这道题纯在纸上算的,502次,但是好像错了,关键就在于题目说时针、分针、秒针都围绕中心做匀速运动。那59分59秒的时候分针、秒针重合,0分0秒也重合,中间没有分开,不知道这两秒算1次还是2次,我是当2次计算结果是502。
本题总分:5 分
【问题描述】
任何一个大于1 的正整数都能被分解为若干个质数相乘,比如28 = 227
被分解为了三个质数相乘。请问在区间[2333333; 23333333] 中有多少个正整数可以被分解为12 个质数相乘?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
这道题起初代码是这样的,跑了3个半小时没跑出来,最后比赛结束了还在跑。。。
import java.util.Scanner; public class Main1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 2333333; 23333333 int n = 0; for (int i = 2333333; i <= 23333333; i++) { if (a(i)) n++; } System.out.println(n); } private static boolean a(int i) { int n = 0, m = 2; while (i != 1) { while (i % m == 0) { n++; if (n > 12) return false; i /= m; } m++; } if (i != 1) n++; return n == 12; } }
然后受大佬启发,明白了一个数的质因数的平方必然小于这个数,如果分解质因数时质数平方已经大于这个数,那么这个数如果不是1就是他质因数中最后一个质数。
例如260分解质因数,首先会分解出两个2,260/2/2=65,再分解出一个5,剩余13,下一个是7,因为7^2大于13,所以13就是260的最后一个质数
所以再代码中a方法中while加上条件 m * m <= i 就可以变快很多。
private static boolean a(int i) {
int n = 0, m = 2;
while (i != 1 && m * m <= i) {
while (i % m == 0) {
n++;
if (n > 12)
return false;
i /= m;
}
m++;
}
if (i != 1)
n++;
return n == 12;
}
时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
小蓝有一个长度为N 的数组,初始时从左到右依次是1;2; 3; : : : N。 之后小蓝对这个数组进行了M 次操作,每次操作可能是以下2 种之一:
- 左移x,即把x 移动到最左边。
- 右移x,即把x 移动到最右边。
请你回答经过M 次操作之后,数组从左到右每个数是多少?
【输入格式】
第一行包含2 个整数,N 和M。 以下M 行每行一个操作,其中“L x”表示左移x,“R x”表示右移x。
【输出格式】
输出N 个数,代表操作后的数组。
【样例输入】
5 3
L 3
L 2
R 1
【样例输出】
2 3 4 5 1
【样例说明】
样例中的数组变化如下:
[1; 2; 3; 4; 5]
[3; 1; 2; 4; 5]
[2; 3; 1;4; 5]
[2; 3; 4; 5; 1]
【评测用例规模与约定】
对于50% 的评测用例,1<=N; M <= 10000:
对于100% 的评测用例,1 <= N; M <= 200000; 1 <= x <= N:
这道题用双向链表很好做,但是java中不熟悉如何继承linkedlist写一个查找到并删除,所以用了个数组模拟链表。因为n是小于等于20w的,所以假设20w个数全部左移或者全部右移,60w长度也够,题中开了70w,其实没有必要。
思路是从数组25w下标开始存放1-n,然后定义L、R索引,代表头尾指针,也就是数组当前用到了什么位置,如果某个数左移,将他原来下标位置值置为0(用于最后遍历输出),让L所在下标等于这个数,同时L–,右移同理,最终遍历L-R,输出不为0的数。
import java.util.Scanner; public class Main3 { public static void main(String[] args) { int[] map = new int[700000]; int l = 250000, r = 250000; Scanner sc = new Scanner(System.in); String s = sc.nextLine(); String[] s1 = s.split(" "); int n = Integer.parseInt(s1[0]); int m = Integer.parseInt(s1[1]); for (int i = 1; i <= n; i++) { map[r++] = i; } String s2; int nn; for (int i = 0; i < m; i++) { s2 = sc.nextLine(); String[] s3 = s2.split(" "); nn = Integer.parseInt(s3[1]); int j; for (j = l - 5; j <= r + 5; j++) { if (map[j] == nn) { break; } } if ("L".equals(s3[0])) { map[--l] = map[j]; map[j] = 0; } else { map[r++] = map[j]; map[j] = 0; } } boolean flag = true; for (int i = l - 5; i <= r + 5; i++) { if (map[i] != 0) { if (flag) { System.out.print(map[i]); flag = false; } else { System.out.print(" " + map[i]); } } } } }
时间限制: 3.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
在平时使用电脑的过程中,经常会打开各种各样的窗口,各个窗口会在桌 面上重叠,并按照一定的层次关系显示。有的窗口能够看到全部内容,而有的窗口只能看到局部。 现在给定一组操作桌面窗口的过程序列,请你通过ASCII 艺术图来绘制最 后桌面的状态。 已知桌面的大小为N * M,即桌面高度为N 个像素,宽度为M 个像素, 其中左上角坐标为(0; 0),右下角坐标为(N - 1; M - 1)。
对于窗口的操作有如下5 种:
- new 操作- 打开一个新窗口 new [PID] [top] [left] [height] [width] 如:new 12 20 30 80 100 表示打开一个PID 为12 的窗口,窗口左上角的坐标为(20; 30),该窗口宽 度为100 个像素,高度为80
个像素;新创建的窗口,其层级为顶层。- move 操作- 移动一个窗口 move [PID] [vertical] [horizontal] 如: move 12 -5 10 表示将PID 为12 的窗口在垂直方向上移动
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/74378?site
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。