读题目是一个坎。。。真心的。。。看了大半天才看题目的意思。。。
传送门:http://codeforces.com/contest/509/problem/B
题意:
讲的是你有n堆石头 有k种颜色可以涂 第二行是代表每堆石头中石头的数量
题目要求你给所有石头涂色。要求一堆石头和另外一堆石头中相同颜色的石头的数量之差小于等于1
举第一个例子
1
1 4
1 2 4
1 2 3 4
第一堆石头中有颜色1 的一个 其他都为0个
第四堆石头中有颜色1 2 3 4的石头各一个
这样颜色1 的石头的数量差 为0 其他的为1
符合题意。所以是YES
解法:贪心。。想要达到目标。。就需要尽可能把颜色平摊。这样才能得到最优解。
判断一堆堆石头中石头数最少的和最多的之间的差 如果差大于你有的颜色的数量 那样肯定没有解。输出NO
其他输出YES 然后按照颜色依次输出就好 比如 1 2 3 4 .... n 1 2 3 4 ...n
AC代码
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
#define INF 0x0f0f0f0f
using namespace std;
int main()
{
int i,j,k,l,m,n,imax=0,imin=105;
int a[105];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>imax) imax=a[i];
if(a[i]<imin) imin=a[i];
}
if(imax-imin>m)
{
printf("NO\n");
}
else
{
printf("YES\n");
for(i=0;i<n;i++)
{
for(j=0;j<a[i]-1;j++)
{
printf("%d ",j%m+1);
}
printf("%d ",j%m+1);
printf("\n");
}
}
}