(贪心)【CF 980C】Posterized

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/suiguia/article/details/80254657