/*
题目链接:http://codeforces.com/problemset/problem/439/C
题意:给出n个数,要分成k份,每份有若干个数,但是只需要关注该份的和为奇数还是偶数,
要求偶数份的个数为p, 奇数份为k-p个。输出方案。
先判断 有没有 k-p 个奇数
然后 输出 k-p-1组 每组1个奇数
然后 判断 p 是否为0
1. p 为0: 看代码
2. p不为0: 先输出一组 只有1个奇数 这样就有 k-p组奇数和了
然后比较 p 与 偶数的个数 .... 看代码
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <sstream>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define debug(a) printf("---%d---\n", a)
#define mem0(a) memset(a, 0, sizeof(a))
#define memi(a) memset(a, inf, sizeof(a))
#define mem1(a) memset(a, -1, sizeof(a))
#define input1(a) scanf("%d", &a)
#define input2(a,b) scanf("%d %d", &a, &b)
#define input3(a,b,c) scanf("%d %d %d", &a, &b, &c)
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e6 + 5;
const int N = 1e4 + 5;
const int mod = 1e8;
int num;
vector<int>even, odd;
int main(void)
{
// freopen("in.txt","r", stdin);
int n, k, p;
cin >> n >> k >> p;
for (int i = 1; i <= n; i++){
cin >> num;
if (num % 2) odd.push_back(num);
else even.push_back(num);
}
int cnt1 = odd.size();
int cnt2 = even.size();
if (cnt1 >= (k-p)){
int rest = cnt1 - (k-p);
if (rest % 2 == 0){ // 如果 rest不为偶数 直接就不行了
if (cnt2 + (rest)/2 >= p){
puts("YES");
for (int i = 0; i < (k-p-1); i++)
printf("1 %d\n", odd[i]);
//------------------ 无语模拟
if (p == 0) { // 如果p为0 单独讨论
printf("%d", cnt1-(k-p-1)+cnt2); // 把剩余的奇数和全部偶数都放在最后一组
for (int i = k-p-1; i < cnt1; i++)
printf(" %d", odd[i]);
for (int i = 0; i < cnt2; i++)
printf(" %d", even[i]);
printf("\n");
return 0;
}
else {
if (k-p-1 >= 0)
printf("1 %d\n", odd[k-p-1]);
}
//---------------------
if (cnt2 >= p-1){ // 偶数个数大于等于 p-1
for (int i = 0; i <= p-2; i++) // 就先输出p-1组偶数
printf("1 %d\n", even[i]);
printf("%d", rest+cnt2-(p-1)); // 把剩余的偶数和剩余的奇数全放在最后一组
for (int i = p-1; i < cnt2; i++)
printf(" %d", even[i]);
for (int i = k-p; i < cnt1; i++)
printf(" %d", odd[i]);
printf("\n");
}
else{
int dex = k-p;
for (int i = 0; i < cnt2; i++) // 偶数个数少于 p-1
printf("1 %d\n", even[i]);
for (int i = cnt2; i <= p-2; i++) // 两个两个奇数配成一组偶数和
printf("2 %d %d\n", odd[dex++], odd[dex++]);
printf("%d", cnt1-dex);
for (int i = dex; i < cnt1; i++)
printf(" %d", odd[i]);
printf("\n");
}
}
else puts("NO");
}
else puts("NO");
}
else puts("NO");
return 0;
}
CodeForce 439C Devu and Partitioning of the Array(模拟)
最新推荐文章于 2019-09-09 19:34:25 发布
本文解析了CodeForces上的一道题目,该题要求将给定的整数集合分为若干组,使得其中偶数组和奇数组的数量符合指定条件,并提供了一种可行的算法实现。
324

被折叠的 条评论
为什么被折叠?



