比赛时间没能通过==, 只能说明自己代码写的太不严谨咯!
解题思想就是贪心
先判断无解的情况:
1. 奇数不够,因为偶数是无法凑成奇数的
2. 偶数不够,2个奇数可以凑成一个偶数
3. 在奇数够用的情况下, 先在k-p堆中每一堆都放一个奇数,
那么剩余的奇数个数一定是个偶数,否则必定会有另外一堆数的和也为奇数。
有解的情况,先放奇数, 每堆一个奇数。接下来要考虑偶数个数 < p的情况,
也就是用两个奇数来凑一个偶数,输出k-1堆后,有解的情况可以保证最后一堆
一定是满足条件的,也就是全部输出。
附上代码:
1 n, k, p = map(int, raw_input().split());
2 a = map(int, raw_input().split());
3 b, c = [], [];
4 even, odd = 0, 0;
5 for i in xrange(n):
6 if a[i] % 2 == 0:
7 even += 1
8 b.append(a[i]);
9 else:
10 c.append(a[i]);
11 odd = n - even;
12 if odd < k-p or (odd-(k-p))/2+even < p or (odd-(k-p))%2:
13 print "NO"
14 else:
15 print "YES";
16 for i in xrange(k-p-1):
17 print 1, c[i]
18 if p == 0:
19 print n-(k-p-1),
20 for i in xrange(k-p-1, odd):
21 print c[i],
22 for i in xrange(0, even):
23 print b[i],
24 else:
25 if k != p:
26 print 1, c[k-p-1]
27 j = k - p;
28 if even >= p and p:
29 for i in xrange(p-1):
30 print 1, b[i]
31 left = n - (k-p) - (p-1)
32 print left,
33 for i in xrange(k-p, odd):
34 print c[i],
35 for i in xrange(p-1, even):
36 print b[i],
37 elif even < p and p:
38 for i in xrange(even):
39 print 1, b[i]
40 for i in xrange(p-even-1):
41 print 2, c[j], c[j+1]
42 j += 2
43 left = n - even - j;
44 print left,
45 for i in xrange(j, j+left):
46 print c[i],