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;
}

浙公网安备 33010602011771号