题意:给你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 }
时间: 2024-10-10 14:45:55