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 }

时间: 2024-10-10 14:45:55

codeforces C. Devu and Partitioning of the Array的相关文章

codeforces 439D Devu and Partitioning of the Array(有深度的模拟)

题目 //参考了网上的代码 注意答案可能超过32位 //要达成目标,就是要所有数列a的都比数列b的要小或者等于 //然后,要使最小的要和最大的一样大,就要移动(大-小)步, //要使较小的要和较大的一样大,也是要移动(较大-较小)步 //然后都加在一起就好了 #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; #def

Codeforces 439C Devu and Partitioning of the Array(模拟)

题目链接:Codeforces 439C Devu and Partitioning of the Array 题目大意:给出n个数,要分成k份,每份有若干个数,但是只需要关注该份的和为奇数还是偶数,要求偶数堆的个数为p.输出方案. 解题思路:首先先将数组按照奇偶排序,也可以分开储存.然后先单独分k-p个奇数,然后后面的就将两个奇数当一个偶数分配,分配过程中计算是否满足,比如说奇数是否成对,以及是否分成了k堆. #include <cstdio> #include <cstring>

codeforces 439C Devu and Partitioning of the Array(烦死人的多情况的模拟)

题目 //这是一道有n多情况的烦死人的让我错了n遍的模拟题 #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; int a[100010],n,k,p; int vis[100010]; int ji=0,ou=0; int main() { memset(vis,0,sizeof(vis)); cin >>

Codeforces Round #251 (Div. 2) C. Devu and Partitioning of the Array

注意p的边界情况,p为0,或者 p为k 奇数+偶数 = 奇数 奇数+奇数 = 偶数 #include <iostream> #include <vector> #include <set> #include <algorithm> #include <cmath> using namespace std; int main(){ int n,k,p; long a; cin >> n >> k >> p; ve

【Henu ACM Round#20 D】 Devu and Partitioning of the Array

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 一开始所有的数字单独成一个集合. 然后用v[0]和v[1]记录集合的和为偶数和奇数的集合它们的根节点(并查集 然后先让v[0]的大小变成p //奇数+偶数是奇数 //奇数+奇数是偶数 //偶数+偶数是偶数 如果v[0].size < p 那么随便让两个和为奇数的集合,让他们合并在一起,加入到偶数集合中,那么v[0].size++,v[1].size-=2了 如果v[0].size > p 那么有两种方法 ?1.让两个偶数集合合

Codeforces 439E Devu and Birthday Celebration(计数问题)

题目链接:Codeforces 439E Devu and Birthday Celebration 题目大意:给出q,表示询问的次数,每次询问有n和f,问有多少种分类方法,将n分成f份,并且这f份的最大共约数为1. 解题思路:如果不考虑说最大共约数为1的话,那么问题很简单,就是f个数的和为n的种数C(f?1n?1).所以我们就尽量将问题转化成说f数的和为s的子问题.用容斥原理,总的可能减去公约数不为1的情况,那么公约数不为1的情况就去枚举公约数. #include <cstdio> #inc

Codeforces 439D Devu and his Brother(排序)

题目链接:Codeforces 439D  Devu and his Brother 题目大意:Devu和他的哥哥互相深爱着对方,我确信他们是搞基的,为此我还去查了一下Devu是男人名还是女人名,但是后来发现His Brother,所以可以证明,他们就是搞基的.题目很简单,父亲给了他们两个人分别一个数组.但是Devu希望自己最小的数都可以不必哥哥最大的数小,现在对数组中的数有两种操作,一种是加1,一种是减1,问最少进行几次操作可以使得两个数组满足要求. 解题思路:将两个数组合并在一起,然后排序,

codeforces 451E Devu and Flowers

题意:有n个瓶子每个瓶子有 f[i] 支相同的颜色的花(不同瓶子颜色不同,相同瓶子花视为相同) 问要取出s支花有多少种不同方案. 思路: 如果每个瓶子的花有无穷多.那么这个问题可以转化为  s支花分到n个瓶子有多少种方案  用隔板法就能解决 C(s+n-1,n-1) .有限制之后我们可以 用 没限制的去减掉那些违反限制的 如果只有一个瓶子取得花超出上限 那么减去,两个瓶子 要加上(容斥原理) n只有20  就能暴力枚举那些取超过上限f[i]的瓶子并且在这些瓶子至少选出 f[i]+1 支花  统计

Codeforces 451E Devu and Flowers(容斥原理)

题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组合. 解题思路:2n的状态,枚举说那些花坛的花取超过了,剩下的用C(n?1sum+n?1)隔板法计算个数.注意奇数的位置要用减的.偶数的位置用加的.容斥原理. #include <cstdio> #include <cstring> #include <cmath> #in