[蓝桥杯 2022 国 B] 齿轮
题目描述
这天,小明在组装齿轮。
他一共有 n n n 个齿轮,第 i i i 个齿轮的半径为 r i r_{i} ri, 他需要把这 n n n 个齿轮按一定顺序从左到右组装起来,这样最左边的齿轮转起来之后,可以传递到最右边的齿轮,并且这些齿轮能够起到提升或者降低转速(角速度)的作用。
小明看着这些齿轮,突然有 Q Q Q 个疑问: 能否按一定顺序组装这些齿轮使得最右边的齿轮的转速是最左边的齿轮的 q i q_{i} qi 倍?
输入格式
输入共 Q + 2 Q+2 Q+2 行,第一行为两个正整数 n , Q n, Q n,Q, 表示齿轮数量和询问数量。
第二行为 n n n 个正整数 r 1 , r 2 , … , r n r_{1}, r_{2}, \ldots, r_{n} r1,r2,…,rn,表示每个齿轮的半径。
后面 Q Q Q 行,每行一个正整数 q i q_{i} qi 表示询问。
输出格式
Q
Q
Q 行,对于每个询问,如果存在至少一种组装方案满足条件,输出 YES
, 否则输出 NO
。
样例 #1
样例输入 #1
5 3
4 2 3 3 1
2
4
6
样例输出 #1
YES
YES
NO
提示
【样例说明】
询问
1
1
1 方案之一:23341
。
询问
2
2
2 方案之一:42331
。
询问 3 3 3 没有方案。
【评测用例规模与约定】
对于 15 % 15 \% 15% 的数据,保证 n , Q ≤ 100 n, Q \leq 100 n,Q≤100;
对于 30 % 30 \% 30% 的数据,保证 n , Q ≤ 2000 n, Q \leq 2000 n,Q≤2000;
对于 100 % 100 \% 100% 的数据,保证 n ≥ 2 , n , Q ≤ 2 × 1 0 5 ; a i , q i ≤ 2 × 1 0 5 n\ge 2,n, Q \leq 2 \times 10^{5} ; a_{i}, q_{i} \leq 2 \times 10^{5} n≥2,n,Q≤2×105;ai,qi≤2×105。
蓝桥杯 2022 国赛 B 组 I 题。
思路
这道题最终要求的就是首的半径 = 尾的半径 *qi ,也就是qi=a/b,我们只要枚举qi即可。(因为本道题的答案为整数,所以a和b有公共的倍数,所谓枚举倍数就是类似代码中所写的)
代码
#include<iostream>
#include<unordered_set>
using namespace std;
const int N = 2e5+10;
int n,m;
int w[N];
unordered_set<int>s,ans;//ans放入倍数即可
bool st[N];
int main(){
cin>>n>>m;
int maxv=0;
for(int i=1;i<=n;i++){
cin>>w[i];
if(s.count(w[i]))ans.insert(1);
s.insert(w[i]);
maxv=max(maxv,w[i]);
}
for(int i:s){
for(int j=2;i*j<=maxv;j++){//枚举倍数
if(s.count(i*j))ans.insert(j);
}
}
while(m--){
int x;
cin>>x;
if(ans.count(x))puts("YES");
else puts("NO");
}
return 0;
}