1 条题解

  • 0
    @ 2025-10-8 16:51:38

    60分代码:

    #include <bits/stdc++.h> 
    using namespace std;
    int a[100005];
    int main()
    {
        int n;scanf("%d", &n);
        for(int i=1;i<=n;i++)scanf("%d", &a[i]);
        int ans=0;
        for(int i=2;i<=n;i++)
        {
            for(int j=i-1;j>=1;j--)
            {
                if(a[j]>a[j+1])
                {
                    ans++;
                    swap(a[j], a[j+1]);
                }
                else break;
            }
        }
        printf("%d\n", ans);
        return 0;
    }
    

    100分代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int a[110005], tmp[110005];
    ll ans;
    void msort(int l, int r)
    {
        if(l >= r)return ;
        int mid=(l + r)/2;
        msort(l, mid);msort(mid+1, r);
        int len = l;
        int i = l, j = mid + 1;
        while(i <= mid && j <= r)
        {
            if(a[i] > a[j])
            {
                ans += mid - i + 1;
                tmp[len++] = a[j++];
            }
            else tmp[len++] = a[i++];
        }
        while(i <= mid)tmp[len++] = a[i++];
        while(j <= r)tmp[len++] = a[j++];
        memcpy(a + l, tmp + l, (r - l + 1)*4);
    }
    int main()
    {
        int n;scanf("%d", &n);
        for(int i=1;i<=n;i++)scanf("%d", &a[i]);
        ans=0;msort(1, n);
        printf("%lld\n", ans);
        return 0;
    }
    
    • 1

    *【递归二分:归并排序】序列的最少交换次数

    信息

    ID
    287
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    68
    已通过
    38
    上传者