更多奇怪的照片
更多奇怪的照片
Farmer John 正再一次尝试给他的 头奶牛拍照。
每头奶牛有一个范围在 之内的整数的「品种编号」,编号可能重复。
Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。
Farmer John 可以分成的最大组数是多少?
输入格式
输入的第一行包含 。
下一行包含 个空格分隔的整数,为 头奶牛的品种编号。
输出格式
输出 Farmer John 的照片中的最大组数。
可以证明,至少存在一种符合要求的分组方案。
数据范围
输入样例1:
7 1 3 5 7 9 11 13
输出样例1:
3
样例1解释
在这个样例中,以下是一种分成最大组数三组的方案。
将 和 分在第一组,、 和 分在第二组, 和 分在第三组。
输入样例2:
7 11 2 17 13 1 15 3
输出样例2:
5
样例2解释
在这个样例中,以下是一种分成最大组数五组的方案。
将 分在第一组, 分在第二组, 和 分在第三组, 分在第四组, 和 分在第五组。
解题思路
先证明一下为什么一定会有解。如果所有的数的总和是偶数,那么必然会得到一组。如果总和为奇数,意味着这些数中必然存在一个奇数,我们把这个奇数拿出来放到第二组,剩余的数(剩余的数的和是偶数)放到第一组。
然后还可以发现,一个数加上偶数并不会改变这个数的奇偶性,一个数加上一个奇数会改变这个数的奇偶性,因此奇数可以通过相加来改变一组的奇偶性。
我们一开始先统计一下奇数和偶数的个数,假设有个偶数,个奇数。每两个奇数可以通过相加得到一个偶数,意味着可以通过减少两个奇数来得到一个偶数,例如,以此类推。满足要求的划分方案一定是要满足或者,即(关键,本题突破口)。
如果,那么总共的组数为。
如果,那么总共的组数为。
如果,由于偶数个数最多比奇数个数多,因此我们可以把多余的偶数进行合并,得到组,因此总共的组数为。
因此如果有,那么总组数为。
因此我们只考虑的情况,如果偶数的个数小于奇数的个数,我们可以通过奇数来凑出偶数,直到满足。(如果已经满足,而继续用奇数凑偶数,可以发现总组数是会减少的。)
AC代码如下:
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 int main() { 6 int n, a = 0, b = 0; 7 scanf("%d", &n); 8 while (n--) { 9 int val; 10 scanf("%d", &val); 11 if (val & 1) a++; 12 else b++; 13 } 14 15 while (a > b) { 16 a -= 2; 17 b++; 18 } 19 20 printf("%d", a == b ? a * 2 : a * 2 + 1); 21 22 return 0; 23 }
参考资料
AcWing 3359. 更多奇怪的照片(春季每日一题2022):https://www.acwing.com/video/3863/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/16267889.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效