试题A: 重合次数
本题总分:5 分
【问题描述】 在同一天中,从上午6 点13 分22 秒到下午14 点36 分20 秒,钟表上的 分针和秒针一共重合了多少次? 注意时针、分针、秒针都围绕中心做匀速运动。
【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
这道题纯在纸上算的,502次,但是好像错了,关键就在于题目说时针、分针、秒针都围绕中心做匀速运动。那59分59秒的时候分针、秒针重合,0分0秒也重合,中间没有分开,不知道这两秒算1次还是2次,我是当2次计算结果是502。
试题B: 数数
本题总分: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;
}
试题C: 左移右移
时间限制: 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]);
}
}
}
}
}
试题D: 窗口
时间限制: 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 的窗口在垂直方向上移动
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)