(摘自网上)
题目意思:有 n 个piles,第 i 个 piles有 ai 个pebbles,用 k 种颜色去填充所有存在的pebbles,使得任意两个piles,用颜色c填充的pebbles数量之差 <= 1。如果不填充某种颜色,就默认数量为0。
这样说还是比较难理解吧~~~以第三组数据为例:
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
第2个 pile 和 第5个 pile 的比较结果如下:
cha[1] = 1 (第2个pile用颜色1填充的数量是1,第5个pile为2)
cha[2] = 1 (第2个pile用颜色2填充的数量是0,第5个pile为1)
cha[3] = 0; cha[4] = 1
要想差尽可能少,就要使得颜色尽量分散。就是说,假如有个 pile 的 pebble 数目为5,可选颜色有4种,这样填就是尽量分散: 1 2 3 4 1。每个pile都这样处理,然后比较两两pile以颜色c填充的数量是否大于1,这样用vector排序比较第一个和最后一个元素之差即可。最后就输出结果了。
总结:这题就是一个构造题,我们能用下面代码的方法构造出符合条件的情况,如果大于M,则不存在,应为只要有一个不是1的数字重复,那么就不成立。#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[200];
int main()
{
int n,m;
cin >> n >> m;
int maxn = -100000;
int minn = 100000;
for(int i=0;i<n;i++)
{
cin >> a[i];
maxn = max(a[i],maxn);
minn = min(a[i],minn);
}
if(maxn-minn>m)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<minn;j++)
printf(j==0?"1":" 1");
for(int j=minn;j<a[i];j++)
{
printf(" %d",j-minn+1);
}
printf("\n");
}
}
return 0;
}