暂无链接
第二题
【问题描述】
给定 k,你需要找到一个最小的 n,使得有至少一个 1~n 的排列不是任何一个字符集
不超过 k 的字符串的后缀排名数组,并构造出这样的排列中字典序最小的一个。
后缀排名数组指:对于一个字符串,将其所有后缀按字典序排序,第 i 的后缀排名为
a[i]。如 abbab 的后缀排名数组为 2 5 4 1 3。
【输入格式】
一行一个正整数 k。
【输出格式】
输出包含两行。第一行为 n,第二行为一个 1~n 的排列满足题目条件。
【输入样例】
2
【输出样例】
3
2 1 3
【样例说明】
长为 2 的字符集不超过 2 的字符串有 aa,ab,ba。后缀排名数组分别为 2 1,1 2,2 1。
包含了所有的排列。长为 3 的字符集不超过 2 的字符串有 aaa,aab,aba,abb,baa,bab,bba。
后缀排名数组分别为 3 2 1,1 2 3,2 3 1,1 3 2,3 2 1,3 1 2,3 2 1。 因此 2 1 3 是符合
条件的解。
【数据范围】
对于 20%的数据点, 1<=k<=10;
对于 50%的数据点, 1<=k<=1000;
对于 100%的数据点, 1<=k<=100000。
题解
打表找规律。
直接贴出题人题解好了:
至于规律??看代码即可。
代码
我的代码非常简短。
#include<cstdio>
main(){int k,f,i;scanf("%d",&k);printf("%d\n",k+=1);f=k&1;for(i=k/2+1;i<=k-f;i++)f?printf("%d %d ",i,k-i):printf("%d %d ",k-i+1,i);if(f)printf("%d",k);}