度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?
输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
输出描述:
输出一个整数表示最少的操作次数。
输入例子1:
4 19 7 8 25
输出例子1:
2
思路:
首先,对于一个长度为size的数组而言,最多调整size-1下即可有序,即每次把倒数第二小的数依次放到后面,那么什么情况下调整的次数会小于size-1下呢?即数组局部有序,比如例子:19,7,8,25。7后面是8,故8不用调整,总调整次数为4-2=2下。再如例子:4,5,1,6,7,2,8,9,3,10,11。数字1,2,3已经是局部有序的了,故不用调整,调整次数为11-3=8下。
可总结如下规律:先找出数组中最小的数字,记下其位置index,从index往后找,看连续有多少个数字已经局部有序,假设有count个数字已经局部有序,则最后调整的次数为size-count
代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 using namespace std; 5 int main() 6 { 7 int N; 8 while(cin>>N) 9 { 10 if(N<=1)cout<<0<<endl; 11 vector<int> arr; 12 while(N--) 13 { 14 int tmp; 15 cin>>tmp; 16 arr.push_back(tmp); 17 } 18 int min=arr[0]; 19 int idx=0; 20 for(int i=1; i<arr.size(); ++i) 21 { 22 if(arr[i]<min) 23 { 24 min=arr[i]; 25 idx=i; 26 } 27 } 28 vector<int> tmp=arr; 29 std::sort(tmp.begin(), tmp.end());//辅助数组排序 30 int k=0; 31 int count=0; 32 for(int i=idx; i<arr.size(); ++i)//从最小值的下标开始往后找 33 { 34 if(arr[i]==tmp[k]) 35 { 36 ++count; 37 ++k; 38 } 39 } 40 cout<<arr.size()-count<<endl; 41 } 42 }