2019牛客假日团队赛3 - 奶牛码

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

链接: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
        //
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44090305/article/details/93626321