Luogu CF1363A Odd Selection题解

【问题分析】

本题考了奇数。

由此想到以下定律:

奇数+偶数=奇数;

奇数+奇数=偶数;

偶数+偶数=偶数;

所以偶数只有凑数量的作用,只有奇数可以对结果产生影响。

经过思考可得奇数必须有奇数个奇数和任意个偶数组成,所以有以下组成方案
(见代码中)。

【设计程序】

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<queue>
 6 using namespace std;
 7 int n, x, t, sum;//sum是奇数个数 
 8 int main()
 9 {
10     int Q;//Q是数据组数 
11     scanf ("%d", &Q);
12     while (Q--)
13     {
14         sum = 0;//奇数个数归零 
15         scanf ("%d%d", &n, &x);//n是有几个数  x是要取几个数 
16         for (int i = 1;i <= n; i++)
17         {
18             scanf ("%d", &t);//输入这个数 
19             if (t % 2 != 0)//如果是奇数 
20                 sum++;//sum 加一 
21         }
22         if (!sum)//如果没有奇数,肯定不行 
23         {
24             printf ("No\n");
25             continue;
26         } 
27         if (sum % 2 == 0)//如果有偶数个奇数 
28         {
29             sum--;//奇数个数减一 
30             n--;//因为要用(n-sum)算偶数个数,所以n也要减一 
31         }
32         if (x >= sum && (x - sum) <= (n - sum))
33         //如果x比sum大,并且偶数数量足够补空 
34         {
35             printf ("Yes\n");//输出可行 
36             continue;
37         }
38         if (x < sum)//如果x比sum小 
39         {
40             if((n - sum) > 0 || x % 2 != 0)
41             //当有一个偶数或要奇数个数时 
42             {
43                 printf ("Yes\n");//输出可行 
44                 continue;
45             }
46         }
47         printf ("No\n");//剩下的情况输出不行 
48     }
49     return 0;
50 }

 

【代码调试】
1. 测试样例
2. 自测数据(边界值,特殊值)

自测:

输入:

5

2 1

100 100

6 4

1 1 1 1 1 1

6 6

1 1 1 1 2 2

6 4

1 1 1 2 1 2

6 5

1 1 2 2 2 2

输出:

No

No

No

Yes

Yes
_____________________________
~~~完结撒花~~~

posted @ 2022-01-08 13:12  睡不醒的凪  阅读(19)  评论(0)    收藏  举报