题目连接:Codeforces 439C Devu and Partitioning of the Array
比较坑一题,很多细节需要把握。
奇数只能由奇数个奇数组成,那让奇数组全由一个奇数组成(除了某些情况,比如p = 0),然后就是各种细节各种判断了。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector <__int64> even, odd;
int main()
{
__int64 n, k, p, temp;
scanf("%I64d%I64d%I64d", &n, &k, &p);
for(int i = 0; i < n; i++)
{
scanf("%I64d", &temp);
if(temp % 2 == 0)
even.push_back(temp);
else
odd.push_back(temp);
}
__int64 _size_odd = odd.size(), _size_even = even.size(), i = 0, j = 0, remain, all;
if(_size_odd < k - p || (_size_odd - (k - p)) % 2 != 0 || ((_size_odd - (k - p)) / 2) + _size_even < p)
puts("NO");
else
{
puts("YES");
if(p == 0)
{
while(i < (k - p) - 1)
printf("1 %I64d\n", odd[i++]);
remain = _size_odd - i + _size_even;
printf("%d", remain);
while(i < _size_odd)
printf(" %d", odd[i++]);
while(j < _size_even)
printf(" %d", even[j++]);
puts("");
}
else
while(i < (k - p))
printf("1 %I64d\n", odd[i++]);
if(p != 0)
{
while(true)
{
remain = p--;
if(remain == 1)
{
all = _size_even - j + _size_odd - i;
printf("%I64d", all);
while(j < _size_even)
printf(" %I64d", even[j++]);
while(i < _size_odd)
printf(" %I64d", odd[i++]);
puts("");
break;
}
else
{
if(j < _size_even)
printf("1 %I64d\n", even[j++]);
else
printf("2 %I64d %I64d\n", odd[i++], odd[i++]);
}
}
}
}
return 0;
}