Codeforces 439C

题目链接

比赛时间没能通过==, 只能说明自己代码写的太不严谨咯!

解题思想就是贪心

先判断无解的情况: 

  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],

 

你可能感兴趣的:(codeforces)