赞
踩
给出大小为 n 的排列,每次操作从后面开始取,取任意大小为 k 的长度组成一种新的排列,问最后这种排列字典序最大是多少
其实很容易发现最优的排列应该类似于
n....n−1....n−2....n−3...1 也就是说从后面开始找这几个点,但是不能够保证 n 之后我们要找的点是 n-1 ,因为 n-1 可能已经与 n 组成排列,所以利用一个数组来找到下一个需要找的点是什么即可
- const int N=5e5+5;
-
- int n,m;
- int i,j,k;
- int a[N];
- bool vis[N];
-
- int main()
- {
- rush(){
- sd(n);
- for(int i=1;i<=n;i++) sd(a[i]);
- vector<int> ans;
- int res=n,pos=n;
- for(int i=n;i;i--){
- if(a[i]==res){
- vis[a[i]]=1;
- for(int j=i;j<=pos;j++) ans.pb(a[j]);
- pos=i-1;
- while(res--){
- if(!vis[res]) break;
- }
- } else{
- vis[a[i]]=1;
- }
- }
- for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
- puts("");
- for(int i=1;i<=n;i++) vis[i]=0;
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。