Out of Sorts [洛谷] (算法理解) /*rank*/

原题传送门


题面:

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值