比赛时间没能通过==, 只能说明自己代码写的太不严谨咯!
解题思想就是贪心
先判断无解的情况:
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],