67 B Restoration of the Permutation
問題
数列a[i]と自然数kに対してb[i]を次のように定める。
b[i]=(aのうち、a[j]=iの項の左側にあるi+k以上の項の数)
b[i]とkが与えられるとき、辞書順で最小となるa[i]を求めよ。
方針
b[i]=0になるようなiのうち最小のものをi0とすれば、
a[0]=i0である。
0番目にi0が来たので、b[0]〜b[j-k]のそれぞれから1を引く。
この操作を繰り返してa[i]を順次出力していけばいい。
ソースコード
int n,k,a[1000],ans[1000]; bool use[1000]; void run(){ cin>>n>>k; rep(i,n)cin>>a[i], use[i]=0; rep(i,n){ rep(j,n)if(!use[j]&&a[j]==0){ use[j]=1; ans[i]=j+1; for(int h=0;h<=j-k;h++)a[h]--; break; } } rep(i,n)cout<<ans[i]<<(i==n-1?"\n":" "); }