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

浙公网安备 33010602011771号