站外题TLE求调
  • 板块学术版
  • 楼主zhonghongyi1234
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/29 09:11
  • 上次更新2025/1/29 19:38:42
查看原帖
站外题TLE求调
1141349
zhonghongyi1234楼主2025/1/29 09:11

题目描述 新年到啦,为了增添节日的欢乐氛围,小明参加了一个特别的数字游戏。

游戏中有这样一种特殊数列:它的长度为 ( n) ,数列中的元素是 ( 1

  1. 到 ( n) 的随机排列。

小明的任务是要把这个特殊数列调整成从 ( 1

  1. 到 ( n) 升序的形式。

不过呢,在这个充满新年趣味的游戏里,对数列的调整有特定的限制,只能进行以下两种操作:

操作一:就像新年里大家传递礼物一样,把数列的第一个数字移到数列的末尾。

操作二:如同新年里倒转福字寓意福到,将整个数列反转。

现在小明想知道,要把这个特殊数列成功排列成 ( 1

  1. 到 ( n) 升序的形式,最少需要进行多少次这样有趣的操作呢?

输入描述 多组输入,输入 0 0表示结束。

每组输入第一行输入一个 n,表示数列长度。

第二行输入 n个数字,表示数列。

输出描述 输出达到升序的最少的操作次数。

输入样例 3 1 3 2 0 输出样例 2 数据范围 数据保证一定可以在有限次进行两种操作下达到升序。 20%的数据: 2≤n≤100 100%的数据下: 1<n≤10 ​5 ​​

mycode:

#include<bits/stdc++.h>
using namespace std;
int n,x,minn=INT_MAX;
string s,s1;
void dfs(string s,int sum){
    if(s==s1){
        minn=min(minn,sum);
        return;
    }
    string t=s;
    t+=t[0];
    t.erase(0,1);
    dfs(t,sum+1);
    reverse(s.begin(),s.end());
    dfs(s,sum+1);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    while(cin>>n&&n){
        for(int i=1;i<=n;++i){
            cin>>x;
            s+=(x+'0');
            s1+=(i+'0');
        }
        dfs(s,0);
        cout<<minn<<'\n';
    }
    return 0;
}
2025/1/29 09:11
加载中...