2014-02-21 44 views
1

對於給定的問題陳述,我們需要計算數組中的反演次數,所以我嘗試應用一種算法,使用合併排序並計算合併時的反演次數以及排序時。雖然我的代碼給出了我作爲自己的解決方案饋給系統的測試用例的相同答案,但我在網上評判員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); 
} 
+2

格式都捨不得虧的......空間上,大括號和評論是免費的,使用它們。 ;-) – DevSolar

+0

這就是作弊..你知道..:P –

+0

只是好奇,你是否計劃在解決'MergeSort'中的內存泄漏,然後再次提交? – WhozCraig

回答

0

這是正確的做法,你有一個非常簡單的問題 - 對倒數目n = 10 可能溢出整數。想想你如何解決這個問題。

+0

我改變了整數cnt long long int,因此它能夠存儲最大可能的倒數即10^5C2 = 4999950000 ,但我仍然得到一個錯誤的答案。 – InsaynAsasin

+0

你有沒有試過最大的測試? –

+0

我想是的。 n的數量是最大10^5的數組元素的數量,所以一個int數組可以存儲這些很多的值,但int cnt不能保存反轉的數量,所以我讓它長了很長的int。但它仍然不起作用。 – InsaynAsasin

0

錯誤是男性和女性的輸入對不會根據男性主廚Mi排序。

在運行合併排序之前,您需要根據Mi <男性編號對排序對進行排序>因爲男性應該按遞增順序排列。

所以你的數組fm應該是數組對,然後根據Mi對它進行排序。

然後全部合併排序操作將基於FM(fm.second)的第二個元素

Solution