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