codeforces1196B Odd Sum Segments 思维

网址:http://codeforces.com/contest/1196/problem/B

题意:

把$n$个数分成连续的且两两不相交的$k$段,要求每段的和都是奇数,若可以输出分法,不行输出$NO$。

题解:

贪心的取区间,偶数$+$偶数$=$偶数,偶数$+$奇数$=$奇数,奇数$+$奇数$=$偶数。所以(奇数个数$-k$)如果是奇数或者是负数,一定不行。否则输出$k-1$个数表示前$k-1$个奇数的位置,和$n$即可。

AC代码:

#include <bits/stdc++.h>
using namespace std;
vector<int>ans;
int main()
{
    int T,n,a,k,odd,even;
    cin>>T;
    while(T--)
    {
        ans.clear();
        odd=even=0;
        cin>>n>>k;
        for(int i=1;i<=n;++i)
        {
            cin>>a;
            if(a%2)
                ++odd,ans.push_back(i);
            else
                ++even;
        }
        if(odd<k)
            cout<<"NO"<<endl;
        else if((k-odd)%2)
            cout<<"NO"<<endl;
        else
        {
            cout<<"YES"<<endl;
            for(int i=0;i<k-1;++i)
                cout<<ans[i]<<" ";
            cout<<n<<endl;
        }
    }
    return 0;
}

 

posted @ 2019-07-27 14:46  Aya_Uchida  阅读(107)  评论(0编辑  收藏  举报