巨巨来袭

本文介绍了一道算法题目,需要求出将一个无序序列通过特定方式变为有序所需的最少移动次数。移动规则为每次只能将一个人放到队列的最前面。文章提供了完整的解题思路及C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

Description

hcbbt巨巨,正宗GFS,深受万千学妹的爱慕,人们为了得到他的一张照片日思夜想,也没有个结果.如今,巨巨为了帮助无奈的霞姐,做出巨大牺牲.他出了一道思考题,凡是能够解出来的,可以获得巨巨的照片.

题意如下:有n个人,巨巨对这些人的身高进行编号,最 矮的为1,以此类推,最高的为n,我们保证每个人的身高都不一样,所以每个人的编号都是不一样的.现在打乱这n个人的顺序,问最少的移动次数使其编号从小 到大排序,移动的规则限定如下:每次只能把其中一个人放在第一个人的最前面,这样算一次操作.

Input

包含T组数据。每组数据第一行为一个整数n,代表有n个人

第二行是现在n个人的编号顺序(0<n<5000)

Output

每组数据输出一行,表示最小的移动次数使得序列从小到大排列。

Sample Input

2
4
1 2 3 4
4
1 3 2 4

Sample Output

0
2

解题思路:在整个数组中寻找数组中最大的数,s=1;在最大的数之前寻找整个数组里次大的数。如果不存在,结果为数组长度(n)-s,退出寻找;如果存在则s++,寻找次大数之前是否有第三大的数。以此类推。

代码如下:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
    return a<b;
}
int main()
{
    int num,n;
    int a[6000],b[6000];
    cin>>num;
    while(num--)
    {
        int m=0,s=1;   //m记录最大数位置 s记录不需要移动的次数
        cin>>n;
        a[0]=0;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i];
            b[i]=a[i];
            if(a[m]<a[i])
                m=i;
        }
        sort(b+1,b+n,cmp);
        for(int i=m-1,j=n-1;i>0;i--)
        {
            if(a[i]==b[j])
            {
                j--;
                s++;
            }
        }
        cout<<n-s<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值