更多奇怪的照片

更多奇怪的照片

Farmer John 正再一次尝试给他的 $N$ 头奶牛拍照。

每头奶牛有一个范围在 $1 \dots 100$ 之内的整数的「品种编号」,编号可能重复。

Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。

Farmer John 可以分成的最大组数是多少?

输入格式

输入的第一行包含 $N$。

下一行包含 $N$ 个空格分隔的整数,为 $N$ 头奶牛的品种编号。

输出格式

输出 Farmer John 的照片中的最大组数。

可以证明,至少存在一种符合要求的分组方案。

数据范围

$2 \leq N \leq 1000$

输入样例1:

7
1 3 5 7 9 11 13

输出样例1:

3

样例1解释

在这个样例中,以下是一种分成最大组数三组的方案。

将 $1$ 和 $3$ 分在第一组,$5$、$7$ 和 $9$ 分在第二组,$11$ 和 $13$ 分在第三组。

输入样例2:

7
11 2 17 13 1 15 3

输出样例2:

5

样例2解释

在这个样例中,以下是一种分成最大组数五组的方案。

将 $2$ 分在第一组,$11$ 分在第二组,$13$ 和 $1$ 分在第三组,$15$ 分在第四组,$17$ 和 $3$ 分在第五组。

 

解题思路

  先证明一下为什么一定会有解。如果所有的数的总和是偶数,那么必然会得到一组。如果总和为奇数,意味着这些数中必然存在一个奇数,我们把这个奇数拿出来放到第二组,剩余的数(剩余的数的和是偶数)放到第一组。

  然后还可以发现,一个数加上偶数并不会改变这个数的奇偶性,一个数加上一个奇数会改变这个数的奇偶性,因此奇数可以通过相加来改变一组的奇偶性。

  我们一开始先统计一下奇数和偶数的个数,假设有$a$个偶数,$b$个奇数。每两个奇数可以通过相加得到一个偶数,意味着可以通过减少两个奇数来得到一个偶数,例如$a+1,~b-2$,$a+2,~b-4$以此类推。满足要求的划分方案一定是要满足$x = y$或者$x = y+1$,即$x \geq y$(关键,本题突破口)。

  如果$x=y$,那么总共的组数为$2y$。

  如果$x = y+1$,那么总共的组数为$2y + 1$。

  如果$x > y+1$,由于偶数个数最多比奇数个数多$1$,因此我们可以把多余的偶数进行合并,得到$y+1$组,因此总共的组数为$2y + 1$。

  因此如果有$x \geq y$,那么总组数为$2y + 1$。

  因此我们只考虑$x \geq y$的情况,如果偶数的个数小于奇数的个数,我们可以通过奇数来凑出偶数,直到满足$x \geq y$。(如果已经满足$x \geq y$,而继续用奇数凑偶数,可以发现总组数是会减少的。)

  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/

posted @ 2022-05-13 19:39  onlyblues  阅读(42)  评论(0编辑  收藏  举报
Web Analytics