[cf509B]Painting Pebbles

题意

给出一种染色方案,使得任意两行中任意两种颜色的元素个数相差不超过1

题解

根据抽屉原理,当k+1个物品放入k个抽屉时,必有两个物品放在同一个抽屉
故当序列最大值-最小值>k时,可以发现无法构造符合题意的方案,必有一种颜色在一个序列中多用了2次及以上
比如1 和 4, 2种颜色,
染色方案只能是
1
1 2 1 1

1
1 2 1 2

对于有解的情况,只要按顺序循环每种颜色填入1个


#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;++i)
#define drep(i,t,s) for(int i=t;i>=s;--i)
#define inf 0x3f3f3f3f
using namespace std;
int n,k,a[101];
int main(){
  scanf("%d%d",&n,&k);
  int maxn=0,minn=inf;
  rep(i,1,n){
    scanf("%d",&a[i]);
    if (a[i]>maxn) maxn=a[i];
    if (a[i]<minn) minn=a[i];
  } 
  if (maxn-minn>k) puts("NO");
  else{
       puts("YES");
       rep(i,1,n){
           int col=1;
           for (int j=1;j<a[i];++j){
               printf("%d ",col);
               ++col;
               if (col>k) col=1;
           }
           printf("%d\n",col);
       }
  }
  return 0;
}

你可能感兴趣的:(贪心,CF)