题面:
Out of Sorts
time limit per test : 1 second
memory limit per test : 256 megabytes
input : standard input
output : standard output
Problem Description
Keeping an eye on long term career possibilities beyond the farm, Bessie the cow has started learning algorithms from various on-line coding websites.
Her favorite algorithm thus far is “bubble sort”. Here is Bessie’s implementation, in cow-code, for sorting an array A
of length N
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
Apparently, the “moo” command in cow-code does nothing more than print out “moo”. Strangely, Bessie seems to insist on including it at various points in her code.
Given an input array, please predict how many times “moo” will be printed by Bessie’s code.
Input
The first line of input contains N (1≤N≤100,000). The next N lines describe A[0]…A[N−1], each being an integer in the range 0…1e9. Input elements are not guaranteed to be distinct.
Output
Print the number of times “moo” is printed.
Sample Input
5
1
5
3
8
2
Sample Output
4
题意描述
冒泡排序算法的理解,给定一个数组,求出冒泡排序中swap运行的次数
题目分析
冒泡排序每一次swap是把不属于前面的推到后面去,那么,在后面的就会被动性的被推到前面,如果到达应该在的位置就会停下.前面被推到后面的swap运行次数是不确定的,但可以确定的是每进行一次swap,应该去前面的就会往前一次,所以只需要找出需要往前次数最大的就是要求的答案-1.(因为即使不进行swap,moo == 1而不是0).
具体代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
struct node
{
int num , preflag;
};
bool cmp(node a, node b)
{
if(a.num != b.num)
{
return a.num < b.num;
}
return a.preflag < b.preflag;//a.num == b.num && a.preflag < b.preflag时,冒泡排序是不会交换a和b的
}
node cow[maxn];
int main()
{
int n;
cin >> n ;
for(int i = 1; i <= n; i++)
{
cin >> cow[i].num ;
cow[i].preflag = i;//保留在原数字中的下标
}
sort(cow+1 , cow+1+n , cmp);
int ans = 0;
for(int i = 1; i <= n; i++)
{
ans = max(ans , cow[i].preflag-i);//找出往前次数最多的
}
cout << ans+1 << endl;
return 0;
}