題意:讓你對[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; }