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],
原文地址:https://www.cnblogs.com/Stomach-ache/p/3769787.html