题目描述
留意着农场之外的长期职业生涯的可能性,奶牛Bessie开始在不同的在线编程网站上学习算法。
她到目前为止最喜欢的算法是“冒泡排序”。这是Bessie的对长度为N的数组A进行排序的奶牛码实现。
sorted = false
while (not sorted):
sorted = true
moo
for i = 0 to N-2:
if A[i+1] < A[i]:
swap A[i], A[i+1]
sorted = false
显然,奶牛码中的“moo”指令的作用只是输出“moo”。奇怪的是,Bessie看上去执着于在她的代码中的不同位置使用这个语句。
给定一个输入数组,请预测Bessie的代码会输出多少次“moo”。
输入描述:
输入的第一行包含N(1≤N≤100,000)。接下来N行描述了A[0]…A[N−1],每个数都是一个范围为0…1e9的整数。输入数据不保证各不相同。
输出描述:
输出“moo”被输出的次数。
样例输入
5
1
5
3
8
2
样例输出
4
既然题目描述是冒泡排序,冒泡序是交换相邻的两个数的值,每次外层循环都会把当前数列中的相邻的两个位置错乱的值交换位置,即将数字前移一个单位或后移一个单位,也就是说外层循环的次数取决于排序后数列中元素的位置和原本位置的差的绝对值的最大值,即移动的距离最远的那个元素移动的距离,所以解题思路就是,用一个变量记录原本在数组中位置,排序后把当前位置和原本位置的差的绝对值求出来,去最大值即可。
代码
#include<bits/stdc++.h>
using namespace std;
struct p{
int value,index;
bool operator < (const p &a){
if(this->value<a.value)return true;
else if(this->value==a.value){
if(this->index<a.index)return true;
return false;
}
return false;
}
};
#define endl "\n"
int n;
int main()
{
#ifdef endl
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
#endif
cin>>n;
vector<p> arr(n);
for(int i=0;i<n;i++)cin>>arr[i].value,arr[i].index=i;
sort(arr.begin(),arr.end());
int res=-1;
for(int i=0;i<n;i++){
res=max(arr[i].index-i,res);
}
cout<<res+1;
return 0;
}