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;
}
【代码调试】
- 
测试样例 
- 
自测数据(边界值,特殊值) 
自测:
输入:
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
完结撒花
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号