题目描述
记得当年的Yaoge刚刚看完谭老的C语言入门经典之后,大家都尊称它为C语言大师。
那时他最精通的排序算法就是冒泡排序了,他的冒泡排序还和书上的不同。
伪代码如下:
Function BubbuleSort (Int Array[])
While (Array[0..n-1] is not sorted) Do
For i = 0 to n-2
If Array[i] > Array[i+1] Do
Swap(Array[i], Array[i+1]);
End If
End For
End While
End Function
现在,C语言大师给大家出了一道难题:
给出一个数组,请想办法计算出代码中的外层循环(While)一共会跑多少次,才能够将整个数组排序完成。
为了简化问题,题目中数组的元素是互不相同的正整数。
(由于数组很大,暴力计算肯定是不行的哦)
输入
多组数据,每组数据第一行是一个整数N。(1 <= N <= 100000)
第二行中有N个互不相同的正整数A[0]~A[N-1] 表示需要排序的数组。(1 <= A[i] <= 10^9)
输出
对于每一组数据,输出一个整数,表示排序需要进行的循环次数。
样例输入
3
1 2 3
2
2 1
3
3 2 1
样例输出
0
1
2
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, num;
int a[100000], b[100000];
while(cin >> n) {
num = 0;
for (int i = 0; i < n; ++i) {
cin >> a[i];
b[i] = a[i];
}
sort(b, b + n);
for (int k = n - 1; k >= 0; --k) {
for (int j = k - num; j >= 0; --j) {
if (a[k] == b[j]) {
num = max(k - j, num);
break;
}
}
}
cout << num << endl;
}
return 0;
}
题目就是找规律,然后再规律的基础上尽可能的剪枝,我听说这道题如何用二分法会更快~。笔者表示自己剪枝并没有彻底,还能剪枝很多~