Codeforces Round #640 (Div. 4) B. Same Parity Summands(思维)

题目点这里

题意

给你一个数n要求分成k份且每份奇偶性相同,可以实现则输出YES和其中一种可能,否则输出NO。

思路

我们可以分成两大类考虑:分成k份由奇数构成和k份偶数构成。
1.奇数构成的情况:
先将k个桶里都放入一个1,则剩下n-k个数。若n-k为偶数,则把n-k都放入其中一个桶里,构成数组 1 1 1 1 …n-k+1 满足题目要求。若n-k为奇数,因为奇数只能拆成若干个偶数+奇数个奇数的形式,所以必然有几个桶里的数字由于这几个奇数变成偶数,不满足都是奇数的情况,输出NO。
2.偶数构成的情况:
类比奇数,k个桶每个放入一个2,判断n-2k的奇偶性,偶数则可行,输出
2 2 2 2 2 … n-2
k+2 否则NO。

AC代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5+10;

int main()
{
    int n,k,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&k);
        if(n>=k&&(n-k)%2==0)
        {
            printf("YES\n");
            for(int i=0; i<k-1; i++)
                printf("%d ",1);
            printf("%d\n",n-k+1);
            continue;//这里的continue观摩某大佬学到的,省去了flag变量,很巧妙。
        }
        else if(n-2*k>=0&&(n-2*k)%2==0)
        {
            printf("YES\n");
            for(int i=0; i<k-1; i++)
                printf("%d ",2);
            printf("%d\n",n-2*k+2);
           continue;
        }
        printf("NO\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Here_SDUT/article/details/106045075