【问题分析】
本题考了奇数。
由此想到以下定律:
奇数+偶数=奇数;
奇数+奇数=偶数;
偶数+偶数=偶数;
所以偶数可以忽略不计,只有奇数可以对结果产生影响,
所以我们只要注意奇数即可。
经过思考可得奇数的个数至少为 $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
完结撒花
标签:奇数,int,题解,Sum,NO,偶数,CF1196B,include,sum From: https://www.cnblogs.com/Assassins-Creed/p/18018409