【问题标题】:Counting number of inversions in an array计算数组中的反转次数
【发布时间】:2014-02-21 11:51:26
【问题描述】:

对于给定的问题陈述,我们需要计算数组中的反转数,因此我尝试使用合并排序应用算法,并在合并和排序时计算反转数。虽然我的代码对我提供给系统的测试用例给出了与我自己的解决方案相同的答案,但我在在线法官 Codechef 上得到了错误的答案。请告诉我我的错误。

问题链接:http://www.codechef.com/COOK43/problems/LPAIR

代码:

#include<iostream>
using namespace std;

long long int Merge(int* left,int* right,int* arr,int nl,int nr)
{
    int i=0;
    int j=0;
    int k=0;
    long long int cnt=0;
    while(i<nl&&j<nr)
    {
        if(left[i]<=right[j])
        {
            arr[k]=left[i];
            i++;
        }
        else
        {
            arr[k]=right[j];
            j++;
            cnt+=nl-i;
        }
        k++;
    }
    while(i<nl)
    {
        arr[k]=left[i];
        i++;
        k++;
    }
    while(j<nr)
    {
        arr[k]=right[j];
        j++;
        k++;
    }
    return cnt;
}

long long int MergeSort(int *a,int len)
{
    long long int cnt=0;
    if(len<2)
        return 0;
    int mid=len/2;
    int* left=new int[mid];
    int* right=new int[len-mid];
    for(int i=0;i<mid;i++)
        left[i]=a[i];
    for(int i=mid;i<len;i++)
        right[i-mid]=a[i];
    cnt+=MergeSort(left,mid);
    cnt+=MergeSort(right,len-mid);
    cnt+=Merge(left,right,a,mid,len-mid);
    delete(left);
    delete(right);
    return cnt;
}

int main()
{
    int n;
    cin>>n;
    int* fm=new int[n];
    for(int i=0;i<n;i++)
        cin>>fm[i]>>fm[i];
    cout<<MergeSort(fm,n);
}

【问题讨论】:

  • 格式化 nitpicker... 空格、大括号和 cmets 是免费的,请使用它们。 ;-)
  • 那是作弊..你知道..:P
  • 只是好奇,您是否打算在再次提交之前修复MergeSort 中的内存泄漏?
  • @WhozCraig 我只是编程领域的新手,无法在我的代码中找到问题,所以我在这里问了我的问题。但我没听懂你说的。
  • 这意味着您在递归之前为拆分为左侧和右侧所做的分配应该在合并完成后删除,否则您会泄漏内存。

标签: c++ arrays sorting mergesort inversion


【解决方案1】:

这是正确的方法,你有一个非常简单的问题 - n = 105 的反转次数可能会溢出整数。想想如何解决这个问题。

【讨论】:

  • 我将整数 cnt 更改为 long long int,因此它能够存储最大可能的反转,即 10^5C2 = 4999950000,但我仍然得到错误的答案。
  • 我认为是的。 n 的数量是最大为 10^5 的数组元素的数量,因此 int 数组可以存储这么多值,但 int cnt 无法保存反转的数量,所以我将其设为 long long int。但它仍然无法正常工作。
  • 我已经更新了代码。你现在可以告诉我问题出在哪里
  • 我希望可以。我唯一注意到的是,您没有在答案后打印换行符。代码对我来说似乎是合法的。
【解决方案2】:

错误是输入的男性和女性对不会按照男性厨师米的排序给出。

在运行归并排序之前,您需要根据 Mi 对配对进行排序,因为男性应该按升序排列。

所以你的数组 fm 应该是对数组,然后根据 Mi 对其进行排序。

然后merge-sort中的所有操作都将基于fm的第二个元素(fm.second)

Solution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2010-09-25
    • 2013-09-16
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多