题目1:给N个数的队列,每一次操作可以让一个数放在队列的最前面,最少几次操作让队列从小到大排序
输入 4 4 3 2 1 ,4个数分别是4 3 2 1,先让3上浮变成3 4 2 1,接着2上浮 2 3 4 1,最后1上浮,只用3次操作
关键点:最小的数如果要上浮也是最后一步上浮,所以大的数先上浮,小数后上浮。
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
template <typename T>
struct cmp
{
bool operator()(const T &x, const T &y)
{
return y<x;
}
};
using namespace std;
int N;
//题目:给N个数的队列,每一次操作可以让一个数放在队列的最前面,最少几次操作让队列从小到大排序
int main(){
scanf("%d",&N);
vector<int> arr;
int Result = 0,k = -1;
unordered_map<int,int> HashMap;
for(int i = 0;i < N;i ++){
int tmp;
scanf("%d",&tmp);
//先记下每个数的位置
arr.push_back(tmp);
HashMap[tmp] = i;
}
//从大到小排序
sort(arr.begin(),arr.end(),cmp<int>());
for(int i = 0;i < arr.size() - 1;i ++){
//比较相邻的2个数,排序后arr数组的数相邻
if(HashMap[arr[i]] < HashMap[arr[i + 1]]){
HashMap[arr[i + 1]] = k--;
Result++;
}
}
printf("%d\n",Result);
return 0;
}