交換最少次使數列有序

2022-05-15 09:59:09 字數 869 閱讀 6181

時間限制: 1 sec  記憶體限制: 128 mb

有一列數,要對其進行排序(公升序)。排序只能通過交換來實現。每次交換,可以選擇這列數中的任意兩個,交換他們的位置,並且交換的代價為這兩個數的和。排序的總代價是排序過程中所有交換代價之和。現要求計算,對於任意給出的一列數,要將其排成公升序所需的最小代價。

輸入包含多組資料。每組資料有兩行組成。第一行乙個數n,表示這列數共有n個數組成。第二行n個互不相同的整數(都是小於1000的正整數),表示這列數。輸入檔案以n=0結尾。

對於每組輸入資料,輸出組號和排序所需的最小代價。

3

3 2 1

48 1 2 4

51 8 9 7 6

68 4 5 3 2 7

0

case 1: 4

case 2: 17

case 3: 41

case 4: 34

首先要明白最小交換次數的演算法,大致就是n - n被分解成單迴圈的個數
具體參照這個部落格

然後這題就離散化一下,找出每個單迴圈,比較計算最小值就行了

#includeusing

namespace

std;

int n,team3[100000

];int team[100000

];int

sum,min,num;

int check[100000]= ;

void f(int

x)int

main()

printf(

"case %d: %d\n\n

",++tot,ans);

}return0;

}

view code

G 數列有序

g 數列有序 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u submit status practice hdu 2019 description 有n n 100 個整數,已經按照從小到大順序排列好,現在另外給乙個...

sdut 數列有序

problem description 有n n 100 個整數,已經按照從小到大順序排列好,現在另外給乙個整數m,請將該數插入到序列中,並使新的序列仍然有序。input 輸入資料報含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0表示輸入資料的結束,...

G 數列有序

有n n 100 個整數,已經按照從小到大順序排列好,現在另外給乙個整數x,請將該數插入到序列中,並使新的序列仍然有序。輸入資料報含多個測試例項,每組資料由兩行組成,第一行是n和m,第二行是已經有序的n個數的數列。n和m同時為0標示輸入資料的結束,本行不做處理。對於每個測試例項,輸出插入新的元素後的...