有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如:3 2 1,交換1 3後為遞增排序,總的交換代價為4。給出n臺機器的重量,求將所有機器變為有序的最小代價。(機器的重量均為正整數)
輸入第1行:1個數n,表示機器及房間的數量。(2 <= n <= 50000)
第2 - n + 1行:每行1個數,表示機器的重量wi。(1 <= wi <= 10^9)
輸出輸出最小代價。
輸入樣例33
21輸出樣例
4所有需要交換的數可以構成一組組環
先對數進行排序
舉兩組資料:
51 3 4 5 2
id : | 1 | 2 | 3 | 4 | 5 | //陣列下標,也是數的理想位置
va: | 1 | 2 | 3 | 4 | 5 | //數值
no: | 1 | 5 | 4 | 3 | 2 | //當前所在位置now
可以發現構成一組環 2->3->4->5->2 或者 2->5->4->3->2(便於**編寫)
為了求最小代價pi,我們以2開始跑
pi=(2+5)+(2+4)+(2+3)= (3+4+6)+2 * 3=18
但還有一種情況
51 8 9 10 7
id : | 1 | 2 | 3 | 4 | 5 | //陣列下標,也是數的理想位置
va: | 1 | 7 | 8 | 9 | 10 | //數值
no: | 1 | 5 | 4 | 3 | 2 | //當前所在位置now
可以發現構成一組環 7->8->9->10->7 或者 7->10->9->8->7(便於**編寫)
為了求最小代價pi,我們先以7開始跑
pi=(7+10)+(7+9)+(7+8)=(8+9+10)+7 * 3= 48
但是還有另外一種情況 我們先將 1,7位置交換,用1代替7去跑,最後再換回來
pi=(1+10)+(1+9)+(1+8)+(1+7) * 2=(8+9+10)+1*3+(1+7)*2= 46 < 48
綜上可以發現pi=(8+9+10)+min(7 * 3 , 1 * 3+(1+7) * 2 )
#includeusing namespace std;
#define ll long long
struct node
a[50010];
bool cmp(node x,node y)
int weizhi[50010];
int main()
sort
(a+1,a+n+1,cmp)
;for
(int i=1;i<=n;i++)
ans+=min
(a[i].w*sum,(a[i].w+a[1].w)*2+a[1].w*sum);}
cout<;
return 0;
}
51nod1125 交換機器的最小代價 貪心
1125 交換機器的最小代價 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如 3 2 1,交換1...
51nod1125 交換機器的最小代價(貪心)
1125 交換機器的最小代價 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如 3 2 1,交換1...
51nod 1125 交換機器的最小代價
這道題是以前數學專題做過類似的,就是學 置換 的時候 比如 2 3 4 1,就是乙個迴圈,因為第乙個位置是2,然後去找第二個位置,是3,又找第三個位置,是4,又找第四個位置,又回到了1。而4 3 2 1,第乙個位置是4,找第4個位置,是1,找第乙個位置,又是4,所以是個迴圈,同理也是個迴圈 那我們為...