链接:https://ac.nowcoder.com/acm/contest/945/H
来源:牛客网
题目描述
留意着农场之外的长期职业生涯的可能性,奶牛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…10
9
0…109的整数。输入数据不保证各不相同。
输出描述:
输出“moo”被输出的次数。
输入
5
1
5
3
8
2
输出
4
解题思路
moo输出的次数,等于左移最多的那项左移的次数,即排序前后的下标最大差+1,即使结果。
原因是,冒泡排序每次都会把一个最大的推到数组后面,这就回导致其他数字往左移,那么往左移了多少就是推了多少轮。
如: 9 6 4 3 1 9 4 5 6
2左移的最远,8位,因此结果为8+1 = 9
解题只需要先做一遍预排序,找到下标差最大的那个,再+1即可。
AC Code:
/*
* Copyright (c) 2019 Ng Kimbing, HNU, All rights reserved. May not be used, modified, or copied without permission.
* @Author: Ng Kimbing, HNU.
* @LastModified:2019-06-25 T 15:45:41.024 +08:00
*/
package ACMProblems.QianDaoTi;
import java.util.Arrays;
import static ACMProblems.ACMIO.*;
/*
* 链接:https://ac.nowcoder.com/acm/contest/945/H
* 来源:牛客网
*
* ## 题目描述
* 留意着农场之外的长期职业生涯的可能性,奶牛Bessie开始在不同的在线编程网站上学习算法。
* 她到目前为止最喜欢的算法是“冒泡排序”。这是Bessie的对长度为N的数组A进行排序的奶牛码实现。
*
* ```python
* 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...10
* 9
* 0...109的整数。输入数据不保证各不相同。
* ## 输出描述:
* 输出“moo”被输出的次数。
* ## 输入
* >5
* 1
* 5
* 3
* 8
* 2
* ## 输出
* >4
*/
public class BubbleSortCount {
static class MyPair {
int index;
int value;
public MyPair(int index, int value) {
this.index = index;
this.value = value;
}
}
public static void main(String[] args) throws Exception {
setStream(System.in);
int n = nextInt();
int[] arr = new int[n];
MyPair[] pairs = new MyPair[n];
for (int i = 0; i < n; ++i) {
int foo = nextInt();
pairs[i] = new MyPair(i, foo);
}
Arrays.sort(pairs, (o1, o2) -> {
if (o1.value != o2.value)
return Integer.compare(o1.value, o2.value);
else return Integer.compare(o1.index, o2.index);
});
int ans = -0x3f3f3f3f;
for (int i = 0; i < n; ++i)
ans = Math.max(ans, pairs[i].index - i);
System.out.println(ans + 1);
// 5 5 4 3 1 0 2 1 0
//
}
}