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
_____________________________
~~~完结撒花~~~

浙公网安备 33010602011771号