AT2686 [ARC080A] 4-adjacent 题解

这道题目如果是暴力肯定不行,标签是入门,看着是个数学题。

如何判断两个数的积是 \(4\) 的倍数呢?

  • 两个数中其中一个数含有因数 \(4\)
  • 两个数的积中含有因数 \(4\),即两个数都是 \(2\) 的倍数(但这两个数都不含因数 \(4\))

所以我们只要边读入边把 \(4\) 的倍数和是 \(2\) 的倍数但不是 \(4\) 的倍数的个数分别计入 \(sum1\) 和 \(sum2\) 中。

注意:这里的判断倍数有先后顺序,要用 else if

得到了 \(sum1\) 和 \(sum2\) 后,\(2\) 的倍数需要两两配对才能组成 \(4\) 的倍数,所以要 \(sum \div 2\),而 \(4\) 的倍数可以与其他任何数配对,所以没有要求,直接加上就可以了,\(sum1 + sum2\) 就是总的配对组数,如果组数大于 \(n \div 2\),输出 Yes,否则输出 No

代码见下

#include <bits/stdc++.h>
using namespace std;
int n, num, sum1, sum2;
int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		scanf("%d", &num);
		if(num % 4 == 0) sum1++;
		else if(num % 2 == 0) sum2++;
	}
	if(sum2 / 2 + sum1 >= n / 2) printf("Yes");
	else printf("No");
	return 0;
}
上一篇:javascript-描述正则表达式模式的正则表达式?


下一篇:Noi.ac #51题解