题目描述
这天,小明在组装齿轮。
他一共有 �n 个齿轮,第 �i 个齿轮的半径为 ��ri, 他需要把这 �n 个齿轮按一定顺序从左到右组装起来,这样最左边的齿轮转起来之后,可以传递到最右边的齿轮,并且这些齿轮能够起到提升或者降低转速(角速度)的作用。
小明看着这些齿轮,突然有 �Q 个疑问: 能否按一定顺序组装这些齿轮使得最右边的齿轮的转速是最左边的齿轮的 ��qi 倍?
输入格式
输入共 �+2Q+2 行,第一行为两个正整数 �,�n,Q, 表示齿轮数量和询问数量。
第二行为 �n 个正整数 �1,�2,…,��r1,r2,…,rn,表示每个齿轮的半径。
后面 �Q 行,每行一个正整数 ��qi 表示询问。
输出格式
�Q 行,对于每个询问,如果存在至少一种组装方案满足条件,输出 YES
, 否则输出 NO
。
输入输出样例
输入 #1复制
5 3 4 2 3 3 1 2 4 6
输出 #1复制
YES YES NO
说明/提示
【样例说明】
询问 11 方案之一:23341
。
询问 22 方案之一:42331
。
询问 33 没有方案。
思路
其实就是判断在一堆数中能否找出倍数关系为Q的两个数,可以把所有收到的数排序,但是不管用我这种方法还是用网上博主方法用Java写都栈爆。。。。。,但是!!,在我坚持不懈的努力下,我发现把JDK版本从java21换到java8,运行速度显著提升!!,占用内存也变少
代码:
import java.util.Arrays; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //用来去掉重复数字,并减少空间浪费 int[] r = new int[200005]; int rnum = scanner.nextInt(); int qnum = scanner.nextInt(); for (int i = 0; i < rnum; i++) { int t = scanner.nextInt(); r[t] = t; } //排序 Arrays.sort(r); int start = 0; //找到不为零的第一个下标 while (r[start++] == 0) ; start--; for (int i = 0; i < qnum; i++) { int questions = scanner.nextInt(); boolean flag = false; for (int i1 = start; i1 < r.length; i1++) { int t = r[i1] * questions; if (t > r[r.length - 1]) break; if (Arrays.binarySearch(r, start, r.length, t) > 0) { flag = true; break; } } System.out.println(flag ? "YES" : "NO"); } } }
结果: