Codeforces 439C Devu and Partitioning of the Array 模拟

来源:互联网 发布:淘宝客服幽默催拍话术 编辑:程序博客网 时间:2024/06/05 10:21

点击打开链接

题意:给出n<=1e5个数 问是否能把n个数 分成k份 其中p份,每份和为even,剩下q=k-p份每份和为odd? 
加入偶数个奇数 或者若干个偶数不会改变奇偶性 
先构造出p组偶数,若偶数不足p个只能用奇数去补
剩下奇数个数必须大于q,每一个奇数一组,最后一组必须是奇数个奇数和才能为奇
坑点:所有数都要用上,p=0,q=0 偶数,奇数有剩下,情况要补全 

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+20;ll n,k,p,x;vector<ll> a,b,ans;int main(){while(cin>>n>>k>>p){int q=k-p;//奇数组数 a.clear();b.clear();for(int i=1;i<=n;i++){scanf("%I64d",&x);if(x%2==0)a.push_back(x);elseb.push_back(x);}bool flag=true;int cnt=a.size();int s=0;for(s=0;cnt<p&&s+2<=b.size();s+=2)//偶数不足 用2个奇数补 a.push_back(b[s]),a.push_back(b[s+1]),cnt++;int re=b.size()-s; if(cnt<p||re<q)//剩下奇数必须>=q puts("NO");else if((re-q+1)%2==0)//q为0 奇数必须要偶数个 才能全部用上, q!=0 最后一组个数为奇数 puts("NO");else{puts("YES");int j=0;for(int i=1;i<=p-1;i++){if(a[j]%2)cout<<2<<' '<<a[j++]<<' '<<a[j++]<<endl;elsecout<<1<<' '<<a[j++]<<endl;}if(p){int x=0;if(q==0)x=re;cout<<a.size()-j+x;while(x)cout<<' '<<b[s++],x--;//补偶数个奇数 for(;j<a.size();j++)cout<<' '<<a[j];cout<<endl;}for(int i=1;i<=k-p-1;i++)cout<<1<<' '<<b[s++]<<endl;if(k-p){int x=0;if(j<a.size())x=a.size()-j;cout<<b.size()-s+x;while(j<a.size())//补偶数,不改变奇偶性 cout<<' '<<a[j++];for(;s<b.size();s++)cout<<' '<<b[s];cout<<endl;}}}return 0;}


0 0
原创粉丝点击