列表

详情


JD22. 队列最小修改

描述

已知一个奇怪的队列,这个队列中有 个数,初始状态时,顺序是 1,2,3,4,…n,是 1-n 按顺序排列。这个队列只支持一种操作,就是把队列中的第 号元素提前到队首 (1<i<=n) ,如有 个元素,初始为 1234 ,可以将 提前到队首,得到 3124 现在给出一个经过若干次操作之后的序列,请你找出这个序列至少是由原序列操作了多少次得到的。

数据范围:

输入描述

第一行是一个整数n(1<=n<=10^5),表示序列中数字的数量。 接下来一行有n个数,是1-n的一个全排列。数字之间用空格隔开。

输出描述

输出仅包含一个数字,表示至少操作了几次

示例1

输入:

5
5 2 1 3 4

输出:

2

说明:

按顺序把 2 和 5 提到队列前

原站题解

C++ 解法, 执行用时: 10ms, 内存消耗: 760KB, 提交时间: 2020-08-09

#include <bits/stdc++.h>
using namespace std;
#define INIT()ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int MAXN=1e5;
int a[MAXN+5];
int main(){
    INIT()
        int n;
    while(cin>>n){
        for(int i=0;i<n;i++)cin>>a[i];
        int ans=n-1;
        for(int i=n-1;i>0;i--){
            if(a[i]>a[i-1])ans--;
            else break;
        }
        cout<<ans<<endl;
    }
    return 0;
}

C++ 解法, 执行用时: 10ms, 内存消耗: 1380KB, 提交时间: 2020-08-29

#include <bits/stdc++.h>
using namespace std;
#define INIT()ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int MAXN=1e5;
int a[MAXN+5];
int main(){
    INIT()
        int n;
    while(cin>>n){
        for(int i=0;i<n;i++)cin>>a[i];
        int ans=n-1;
        for(int i=n-1;i>0;i--){
            if(a[i]>a[i-1])ans--;
            else break;
        }
        cout<<ans<<endl;
    }
    return 0;
}

上一题