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 >> n >> k >> p;
    for(int i=0;i<n;i++)
    {
        cin >> a[i];
        if(a[i]%2==1)
            ji++;
        else ou++;
    }
    if((ji-(k-p))%2==1||ji<k-p||((ji-(k-p))/2+ou<p))
        printf("NO\n");
    else
    {
        printf("YES\n");
        int odd=0,even=0,al=0;
        if(p!=0)
        {
            for(int i=0;i<n;i++)
            {
                if(a[i]%2)
                {
                    if(odd<k-p)
                    {
                        printf("1 %d\n",a[i]);
                        odd++;
                        vis[i]=1;
                        al++;
                    }
                    else break;
                }
            }

            for(int i=0;i<n;i++)
            {
                if(a[i]%2==0)
                {
                    if(even<p-1)
                    {
                        printf("1 %d\n",a[i]);
                        even++;
                        vis[i]=1;
                        al++;
                    }
                    else break;
                }
            }
            int flag=1;
            for(int i=0;i<n;i++)
            {
                if(even<p-1)
                {
                    if(vis[i]==0&&a[i]%2==1&&flag==1)
                        printf("2 %d",a[i]),flag=0,vis[i]=1,al++;
                    else if(vis[i]==0&&a[i]%2==1&&flag==0)
                        printf(" %d\n",a[i]),flag=1,vis[i]=1,even++,al++;
                }
                else break;
            }
            if(n-al>0)
            {
                cout << n-al;
                for(int i=0;i<n;i++)
                {
                    if(vis[i]==0)
                        printf(" %d",a[i]);
                }
            }    

        }
        else
        {
            for(int i=0;i<n;i++)
            {
                if(a[i]%2)
                {
                    if(odd<k-p-1)
                    {
                        printf("1 %d\n",a[i]);
                        odd++;
                        vis[i]=1;
                        al++;
                    }
                    else break;
                }
            }
            if(n-al>0)
            {
                cout << n-al;
                for(int i=0;i<n;i++)
                {
                    if(vis[i]==0)
                        printf(" %d",a[i]);
                }
            }    

        }
        puts("");
    }
    return 0;
}

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

时间: 2024-10-12 08:35:11

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

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 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 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 #defin

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