题目链接:http://codeforces.com/contest/439/problem/C
题意:给出n个数,要求将其分为k份,k有p份之和是偶数,p-k份之和是奇数,给出分配方案
思路:2个奇数可以组成一个偶数,一个奇数一个偶数可以组成一个奇数,这样构造就行,一开始用数组保存方案数,结果超内存了,后来直接构造好就输出,最后一组数的和可能要求是奇数也可能要求是偶数,所以奇数和偶数先保留一位不进行输出
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int s[100030];
int odd[100030],even[100030];
int main()
{
int n,k,p;
while (scanf("%d%d%d",&n,&k,&p)!=EOF)
{
memset(odd,0,sizeof(odd));
memset(even,0,sizeof(even));
int cnt1=0,cnt2=0;
for (int i=0;i<n;i++)
{
scanf("%d",&s[i]);
if (s[i]%2==0)
{
even[cnt2++]=s[i];
}
else
{
odd[cnt1++]=s[i];
}
}
if (cnt1<k-p || (cnt1-k+p)%2==1 || (cnt1-k+p)/2+cnt2<p)
{
printf("NO\n");
}
else
{
cout<<"YES"<<endl;
for (int i=0;i<k-p-1;i++)
{
cout<<"1 "<<odd[cnt1-1]<<endl;
cnt1--;
}
for (int i=0;i<p-1;i++)
{
if (cnt2>0)
{
cout<<"1 "<<even[cnt2-1]<<endl;
cnt2--;
}
else if (cnt1>=2)
{
cout<<"2 "<<odd[cnt1-1]<<" "<<odd[cnt1-2]<<endl;
cnt1=cnt1-2;
}
}
if (k-p && p)
cout<<"1 "<<odd[--cnt1]<<endl;
if (cnt2+cnt1>0)
{
cout<<cnt2+cnt1;
for (int i=0;i<cnt1;i++)
{
cout<<" "<<odd[i];
}
for (int i=0;i<cnt2;i++)
{
cout<<" "<<even[i];
}
cout<<endl;
}
}
}
}