ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CF2259B Minus Two

CF2259B Minus Two

题目链接:

Problem - 2259B - Codeforces

我的解答

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stdio.h> using namespace std; int main() { int t; cin >> t; int jishu = 0, oushu = 0; while(t--) { int n; cin >> n; int arr[3] = { 0 }; while (n--) { int x; cin >> x; if (x % 2 != 0) arr[1]++; else { if ((x % 4) == 0) arr[2]++; else arr[0]++; } } int max = arr[0]; for (int i = 0; i < 3; i++) { if (arr[i] > max) max = arr[i]; } cout <<max << '\n'; } return 0; }

思路:

可以发现,将操作次数拉至无限大时,所有数都只会剩下:0,1,2

然后奇数最后结果一个为1,且不只要为1,以后永远为1

但偶数又得分两种情况讨论:

我这一轮是2,但下一轮可能就是0了

其他的偶数可能都不同步,出现了“摇摆”

这也是不能暴力只分奇数偶数来做的原因

如何判断一个偶数属于2还是0系列

就要mod4

最后看看哪一组数最多就好了

这就是代码整体思路

除了我可能写得比较臃肿之外,也是最优解了

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进