Luogu CF1196B Odd Sum Segments题解

【问题分析】

本题考了奇数。

由此想到以下定律:

奇数+偶数=奇数;

奇数+奇数=偶数;

偶数+偶数=偶数;

所以偶数可以忽略不计,只有奇数可以对结果产生影响,
所以我们只要注意奇数即可。

经过思考可得奇数的个数至少为k个且比k多的个数为偶数,此时多出的奇数可组成偶数,对结果不产生影响。

【设计程序】

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<queue>
 6 using namespace std;
 7 const int N = 2 * 1e5;
 8 int a[N];//用来存每一个奇数的位置
 9 int n, k, t, sum;//sum是奇数的总个数
10 int main()
11 {
12 int Q;//有Q组数据
13 scanf ("%d", &Q);//输入Q
14 while (Q--)
15 {
16 sum = 0;//归零
17 scanf ("%d%d", &n, &k);
18 for (int i = 1;i <= n; i++)
19 {
20 scanf ("%d", &t);//输入这个数
21 if (t % 2 != 0)//如果是奇数
22 a[++sum] = i;
23 //个数加1,把位置存下来
24 }
25 if (sum < k || (sum - k) % 2 != 0)
26 //如果奇数个数少于k或者比k多奇数个
27 {
28 printf ("NO\n");//输出不行
29 continue;//开始下一组数据
30 }
31 printf ("YES\n");//输出可行
32 for (int i = 1;i <= k - 1; i++)//输出前k – 1 个奇数的位置
33 printf ("%d ", a[i]);
34 printf ("%d\n", n);//最后一个位置肯定在n的位置
35 }
36 return 0;
37 }

 


【代码调试】

1. 测试样例

2. 自测数据(边界值,特殊值)

自测:

输入:

5

3 2

2 2 2

5 1

1 1 1 1 1

6 2

1 1 1 1 1 1

6 3

1 1 1 3 5 1

5 2

1 1 1 1 1

输出:

NO

YES

5

YES

1 6

NO

NO


------------
完结撒花

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