有趣的排序

来源:互联网 发布:snmp网络管理框架 编辑:程序博客网 时间:2024/05/16 04:18

百度笔试

1、问题描述

度度熊有一个N个数的数组,他想将数组从小到大排好序,但是度度熊只会:任取数组的一个数放置到最后。问最少操作多少次可以使得数组从小到大有序

输入描述:

首先输入一个正整数N,接下来的一行输入N个整数。(N<=50,每个数绝对值小于等于1000)
输出描述:

输出一个整数表示最少操作次数。

输入:

419 7 8  25

输出:

2

2、分析

正向思路可以将原序列中排列相对位置不对长度计算出即可,但似乎实现略难。

反向思考,找出原序列中可以作为排序后前缀的长度,然后n减去此长度即可。

前缀长度即不需要动的元素,可将原序列进行排序,将排序后的序列与原序列对比,从排序后最小开始,符合,新旧同时序列下标后移;不符合,只移动旧序列下标。直到将原序列对比完成,当前新序列下标即不需要移动的原序列元素长度。

3、步骤

1)输入参数

2)序列排序

3)原序列依次从排序后序列最小开始对比

4)对比完成,输出n减去当前下标

4、实现代码

#include <bits/stdc++.h>using namespace std;vector <int> x;int solve(vector <int> a){vector <int> b;b=a;sort(b.begin(),b.end());//排序int q,n=a.size()-1;q=-1;for(int i=0;i<=n;i++){if(a[i]==b[q+1]){//从0下标开始对比q++;//q为不需要移动的长度}}return n-q;}int main(){int n;cin>>n;for(int i=0;i<n;i++){int tmp;cin>>tmp;x.push_back(tmp);}cout<<solve(x)<<endl;return 0;}