codeforces C. Devu and Partitioning of the Array

题意:给你n个数,然后分成k部分,每一个部分的和为偶数的有p个,奇数的有k-p个,如果可以划分,输出其中的一种,不可以输出NO;

思路:先输出k-p-1个奇数,再输出p-1个偶数,剩余的在进行构造。  奇数+奇数=偶数。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <vector>

 4 #include <iostream>

 5 #include <algorithm>

 6 #define maxn 1000100

 7 #define ll long long

 8 using namespace std;

 9 

10 int n,k,p;

11 ll a[maxn];

12 vector<int>qq;

13 vector<int>pp;

14 

15 int main()

16 {

17     scanf("%d%d%d",&n,&k,&p);

18     for(int i=1; i<=n; i++)

19     {

20         scanf("%lld",&a[i]);

21         if(a[i]%2==0) qq.push_back(a[i]);

22         else if(a[i]%2!=0) pp.push_back(a[i]);

23     }

24     int odd=pp.size();

25     int even=qq.size();

26     if(odd<k-p||(odd>=k-p&&even+(odd-(k-p))/2<p)||(odd-(k-p))%2==1)

27     printf("NO\n");

28     else

29     {

30         printf("YES\n");

31         for(int i=0; i<k-p-1; i++)

32         {

33             printf("%d %d\n",1,pp[i]);

34         }

35         int x=k-p-1;

36         int y=even;

37         if(x<0)x=0;

38         for(int i=0; i<p-1; i++)

39         {

40              if(y)

41              {

42                  printf("%d %d\n",1,qq[y-1]);

43                  y--;

44              }

45              else

46              {

47                  printf("%d %d %d\n",2,pp[x],pp[x+1]);

48                  x+=2;

49              }

50         }

51         if(k-p!=0&&p)

52         {

53             printf("%d %d\n",1,pp[x]);

54             x++;

55         }

56         if(x<0) x=0;

57         printf("%d ",y+odd-x);

58         while(y)

59         {

60             printf("%d ",qq[y-1]);

61             y--;

62         }

63         while(x<odd)

64         {

65             printf("%d ",pp[x]);

66             x++;

67         }

68         printf("\n");

69     }

70     return 0;

71 }
View Code

 

你可能感兴趣的:(codeforces)