由抽屉原理可知当最大堆和最小堆的数量大于类别时 ,就没有满足条件,若非则输出YES。 抽屉原理为:当 如果每个抽
屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定至少有一个集合里有两
个元素。即当他们差值大于类别,就一定有一个树是相差两个的额
There are n piles of pebbles on the table, the i-th pile contains ai pebbles. Your task is to paint each pebble using one of the k given colors so that for each color c and any two piles i and j the difference between the number of pebbles of color c in pile i and number of pebbles of color c in pile j is at most one.
In other words, let's say that bi, c is the number of pebbles of color c in the i-th pile. Then for any 1 ≤ c ≤ k, 1 ≤ i, j ≤ n the following condition must be satisfied |bi, c - bj, c| ≤ 1. It isn't necessary to use all k colors: if color c hasn't been used in pile i, then bi, c is considered to be zero.
The first line of the input contains positive integers n and k (1 ≤ n, k ≤ 100), separated by a space — the number of piles and the number of colors respectively.
The second line contains n positive integers a1, a2, ..., an (1 ≤ ai ≤ 100) denoting number of pebbles in each of the piles.
If there is no way to paint the pebbles satisfying the given condition, output "NO" (without quotes) .
Otherwise in the first line output "YES" (without quotes). Then n lines should follow, the i-th of them should contain ai space-separated integers. j-th (1 ≤ j ≤ ai) of these integers should be equal to the color of the j-th pebble in the i-th pile. If there are several possible answers, you may output any of them.
4 4
1 2 3 4
YES
1
1 4
1 2 4
1 2 3 4
5 2
3 2 4 1 3
NO
5 4
3 2 4 3 5
YES 1 2 3 1 3 1 2 3 4 1 3 4 1 1 2 3 4#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { int a,b,i,min,max; int j; int c[100010]; scanf("%d%d",&a,&b); for(i=0;i<a;i++) scanf("%d",&c[i]); min=c[0];max=c[0]; for(i=1;i<a;i++) { if(min>c[i]) min=c[i]; if(max<c[i]) max=c[i]; } if(max-min>b) printf("NO\n"); else { printf("YES\n"); for(i=0;i<a;i++) { int t=1; for(j=1;j<c[i];j++) { if(t%b==0) printf("%d ",b); else if(t>b) printf("%d ",t%b); else printf("%d ",t); t++; } if(t%b==0) printf("%d\n",b); else printf("%d\n",t%b); } } return 0; }