求下列數列中逆序數對最少的乙個,並求出逆序數對數量?(n <= 5000)
a1, a2, ..., an-1, an
a2, a3, ..., an, a1
a3, a4, ..., an, a1, a2
...an, a1, a2, ..., an-1
#pragma warning (disable:4786)
#include#includeusing namespace std;
#define max 5000
int arr[max + 10];
int main()
//常規 n^2 方法求逆序數對
int count = 0;
for(i = 0; i < n; i ++)
}//求出將每一位數移動到最後時較前乙個陣列的逆序數對數量改變值
int c1, c2,min = count;
for( i =0; i < n; i ++ )
for( j = i + 1; j < n; j ++ )
count = count + c2 - c1;
if( count < min )
min = count;
}printf("%d\n", min );
}return 0;
}
求逆序數對
題意 給出長度為n的序列,每次只能交換相鄰的兩個元素,問至少要交換幾次才使得該序列為遞增序列。1.先對輸入的陣列離散化,使得各個元素比較接近,而不是離散的 a的操作就是離散化 2.接著,運用樹狀陣列的標準操作來累計陣列的逆序數。include iostream include cstdio incl...
樹狀陣列求逆序對(逆序數)
逆序數 也叫逆序對 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。無重複的數 include include include include include include using namespace...
HDU 4944 逆序數對
題意 給出乙個序列,可以相鄰的交換k次,求 k 次之後,逆序數對最少是多少 分析 可以發現,無論怎麼交換之後,總共的逆序數對只會 1,那麼結果就是,將這個序列排整齊時,要兩兩交換的次數 k 題目就轉換為求這個序列的逆序數對有多少 這樣的兩兩交換好像是氣泡排序,氣泡排序是o n 2 正確解法是歸併排序...