题目描述:
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;
}