標籤:
題意:給你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 else29 {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 else46 {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 C. Devu and Partitioning of the Array