题目链接:http://codeforces.com/contest/980/problem/C
题意:大概就是一种处理照片的手段,把相近的颜色统一替换成同一种颜色(题意中的key)。
给一个大小为n的数组,将数组分组,一个组必须是连续的数字,且相差不超过k。要求字典序最小。所以可以肯定的是一组数字会被替换成这组数字的第一个,也就是最小的那个。
贪心处理,从当前数字a[i]往前,如果前面的数字a[j]还未分组,则分到一组。如果a[j]已分组,则判断a[i]能否合并到一组。
/*
* @Author: Samson
* @Date: 2018-05-09 14:09:38
* @Last Modified by: Samson
* @Last Modified time: 2018-05-09 15:40:57
*/
// @URL : http://codeforces.com/contest/980/problem/C
#include<bits/stdc++.h>
#include<algorithm>
#include <cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
int a[MAXN],f[260],n,k;
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i = 1; i <= n; ++i)
cin>>a[i];
memset(f,-1,sizeof f);
for(int i = 1; i <= n; ++i)
{
if(f[a[i]] == -1)
{
int low = -1;
for(int j = a[i]; j>=0 && j>=a[i]-k+1; --j)
{
if(f[j] != -1)
{
if(f[j] >= a[i]-k+1)
low = f[j];
break;
}
low = j;
}
for(int j = low; j <= a[i]; ++j)
f[j] = low;
}
}
for(int i = 1; i <= n; ++i)
cout<<f[a[i]]<<' ';
cout<<'\n';
return 0;
}