题意:给出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);
else
b.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;
else
cout<<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;
}