【貪心】Codeforces Round #480 (Div. 2) C. Posterized

題意:讓你對[0,255]這個序列任意劃分紅一些不重疊的子段,每一個子段的大小不超過K。給你n個不超過255的數,讓你將每一個數替換成它所在子段的任意一個元素,使得最終這個n個數的序列的字典序最小。spa

p[x]表明x做爲表明元素的話,其所控制的區間的最後一個元素是誰。blog

讀入一個數a的時候,在[0,255]數軸上找它前面的離它最近的一個已被標記的數b,若是與其的距離不超過K,則a的表明元素就是b,而後將p[b]更新成max(p[b],a)。it

若是b與a的距離比K還大,就把控制a的元素記爲c=max(a-K+1,p[b]+1),由於咱們不能涉及b已經控制的區間。而後把p[c]更新爲a。io

#include<cstdio>
#include<algorithm>
using namespace std;
int n,K,p[256];
bool b[256];
int main(){
	int x,t,tt;
	scanf("%d%d",&n,&K);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		t=-1;
		for(int j=x;j>=0;--j){
			if(b[j]){
				t=j;
				break;
			}
		}
		if(t==-1){
			if(x>=K){
				b[x-K+1]=1;
				p[x-K+1]=x;
				printf("%d%c",x-K+1,i==n ? '\n' : ' ');
			}
			else{
				b[0]=1;
				p[0]=x;
				printf("0%c",i==n ? '\n' : ' ');
			}
		}
		else if(t+K-1<x){
			tt=max(x-K+1,p[t]+1);
			b[tt]=1;
			p[tt]=x;
			printf("%d%c",tt,i==n ? '\n' : ' ');
		}
		else{
			p[t]=max(p[t],x);
			printf("%d%c",t,i==n ? '\n' : ' ');
		}
	}
	return 0;
}
相關文章
相關標籤/搜索