核酸检测(C++)!?‘’?】?

描述

幼儿园的老师组织同学们排队做核酸检测,为了防止队伍混乱,老师给每一位同学都分配了一个编号,希望同学们按照编号从小到大的顺序排队.



kid-queue.JPG



但是同学们在排队的时候并没有按照编号来排队.



对于某位同学来说,如果排在前面的其他某一位同学的编号比他的编号大,那么他们的编号就称为一对“逆序对”.



例如

1 4 3 2 5

队伍中“4 3” “4 2” “3 2”都是逆序对


输入
输入数据包括两行

第一行只有一个整数n(范围[1,10000]),表示学生人数

第二行n个整数,表示队伍中同学们的编号,编号范围[1,n],并且没有重复的编号.


输出
请输出队伍中一共有多少逆序对


输入样例 1 

5
1 4 3 2 5
输出样例 1

3
语言:C++

【以下回答由 GPT 生成】

#include <iostream>
#include <vector>

using namespace std;

int mergeSort(vector<int>& nums, int start, int end) {
    if (start >= end) {
        return 0;
    }

    int mid = start + (end - start) / 2;
    int count = mergeSort(nums, start, mid) + mergeSort(nums, mid+1, end);

    vector<int> temp(end - start + 1);
    int i = start, j = mid + 1, k = 0;
    while (i <= mid && j <= end) {
        if (nums[i] <= nums[j]) {
            temp[k++] = nums[i++];
        } else {
            temp[k++] = nums[j++];
            count += mid - i + 1;
        }
    }

    while (i <= mid) {
        temp[k++] = nums[i++];
    }

    while (j <= end) {
        temp[k++] = nums[j++];
    }

    for (int i = start, k = 0; i <= end; i++, k++) {
        nums[i] = temp[k];
    }

    return count;
}

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }

    int count = mergeSort(nums, 0, n - 1);
    cout << count << endl;

    return 0;
}

通过归并排序的方法,可以计算出数组中逆序对的数量。首先将数组分为两个部分,然后递归地计算每个部分中的逆序对数量,再将两个部分合并时,如果前半部分的数字比后半部分的数字大,则构成逆序对,并且计算逆序对的数量。最后将两个部分排序合并,得到整个数组的逆序对数量。时间复杂度为O(nlogn),空间复杂度为O(n)。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这个最简单的就是双层for循环查找,对于一个a[i],j=i+1开始,只要a[i]比 a[j]大,就是一对逆序数。
运行结果:

img

代码:

#include <iostream>
using namespace std;

int main()
{
    int n;
    int* a = 0;
    cin >> n;
    a = new int[n];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i]; //输入n个人的编号
    }

    int cnt = 0; //逆序数对数
    //遍历所有的编号
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++) //查找a[i]后面比a[i]小的数字
        {
            if (a[i] > a[j])
                cnt++;
            else
                break;
        }
    }
    cout << cnt;
    delete[] a;
    return 0;
}

可以将输入的数存入数组,再使用双层for循环来遍历数组,判断数组前面的数比后面的数大的有多少对即可。

代码如下:


#include <iostream>

using namespace std;

int main(void){
    
    int n;
    int arr[10000];   // 存储最多10000个整数数据的数组 
    int num=0;
    
    cin>>n;   //  获取输入的数据的个数n 
    
    // 从输入获取n个整数 
    for(int i=0;i<n;i++){
        cin>>arr[i];
    
    }

    
    // 遍历数组,寻找逆序数有多少对 
    for(int i=0;i<n-1;i++){
        
        for(int j=i+1;j<n;j++){
            // 如果数组前面的数比后面的数大,则逆序数个数+1 
            if(arr[i]>arr[j]){
                num++;
            }
            
        }
    }
    
    //  打印结果 
    cout<<num;
    
    return 0;
    
} 

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632