CF1196B Odd Sum Segments题解

【问题分析】

本题考了奇数。

由此想到以下定律:

奇数+偶数=奇数;

奇数+奇数=偶数;

偶数+偶数=偶数;

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

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

【设计程序】

#include<bits/stdc++.h>
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 2 * 1e5;
int a[N];//用来存每一个奇数的位置
int n, k, t, sum;//sum是奇数的总个数
int main()
{
	int Q;//有Q组数据
	scanf ("%d", &Q);//输入Q
	while (Q--)
	{
		sum = 0;//归零
		scanf ("%d%d", &n, &k);
		for (int i = 1;i <= n; i++)
		{
			scanf ("%d", &t);//输入这个数
			if (t % 2 != 0)//如果是奇数
				a[++sum] = i;
           			//个数加1,把位置存下来
		}
		if (sum < k || (sum - k) % 2 != 0)
		//如果奇数个数少于k或者比k多奇数个
		{
			printf ("NO\n");//输出不行
			continue;//开始下一组数据
		}
		printf ("YES\n");//输出可行
		for (int i = 1;i <= k - 1; i++)//输出前k – 1 个奇数的位置
			printf ("%d ", a[i]);
		printf ("%d\n", n);//最后一个位置肯定在n的位置
	}
	return 0;
}

【代码调试】

  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 @ 2024-02-17 20:59  睡不醒的凪  阅读(11)  评论(0)    收藏  举报