Out of Sorts II 题解

题面:

在这里插入图片描述

翻译:

贝西又写了一段代码进行冒泡排序.
对于给出的一组数据,在排序完成之后,moo语句会被执行多少次?

输入:

第一行是一个整数n,代表输入的数字有多少个
后面n行是待排序的数字

输出:

输出一个整数,代表moo执行的次数.

题目分析:

我们先把他给出的数据排序好,然后用一个数组c[]记录他每个数据最终会移动到哪个位置.
注意要让移动的幅度尽量少.
比如:
排序前是1515
排序后是 1155
这个第三个位置上的’1’,是应该移到第二位而不是第一位.

然后从头开始处理c数组

每一次进行循环,都可以把一个应该在后面的数字移到后面.
所以我们从i=1开始判断到i=n,原本在i位置前面并且要移动到i位置后面的数字的个数为ans.
找到这个ans的最大值.

这个最大值就是答案.

代码:

#include<stdio.h>
#include<algorithm>
#include<memory.h>

long n, a[100100], s[100100], c[100100], ans, maxans = 1;
bool match[100100];

long findm(long m){
    long i = m;
    while(s[i] == s[m]) i++;
    i--;
    while(s[i] == s[m] && !match[i]) i--;
    i++;
    while(!match[i]){
        match[i] = 1;
        return i;
        i++;
    }
}

long find(long l, long r, long i){
    long m = (l + r) >> 1;
    if(s[m] == i)   return findm(m);
    if(i < s[m])    return find(l, m-1, i);
    else return find(m+1, r, i);
}

int main(){
    scanf("%ld", &n);
    for(long i = 1; i <= n; ++i){
        scanf("%ld", a+i);
        s[i] = a[i];
    }
    std::sort(s+1, s+n+1);
    for(long i = 1; i <= n; ++i){
        c[i] =find(1,n,a[i]);
    }

    memset(match, 0, sizeof(match));

    for(long i = 1; i <= n; ++i){
        if(c[i] > i)
            ans++;
        if(match[i])
            ans--;
        match[c[i]] = 1;
        maxans = (maxans>ans)?maxans:ans;
    }
        printf("%ld\n", maxans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值