有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如:3 2 1,交換1 3後為遞增排序,總的交換代價為4。
給出n臺機器的重量,求將所有機器變為有序的最小代價(機器的重量均為正整數)。
輸入第1行:1個數n,表示機器及房間的數量。(2 <= n <= 50000)
第2 - n + 1行:每行1個數,表示機器的重量wi。(1 <= wi <= 10^9)
輸出最小代價
樣例1輸入
5
1 8 97
6
樣例1輸出
41
以樣例1例,先進行排序下標1
2345
排序前189
76排序後167
89我們從元素1開始看,排序後元素1的位置還是1,那麼就給1到1之間連一條邊,形成乙個自環;再到元素8,元素8排序以後到了第4個位置,而第四個位置是元素7,所以給8到7之間連一條有向邊,同理連完剩下的邊可以得到一張圖:
那麼我們可以發現兩個環,那麼我們回到題目中來,要使最後的總和最小,我們的貪心思路是什麼?
策略一:
對於每乙個環的貪心思路就是,找到這個環中最小的那個點,也就是6,然後從6開始進行交換,6和9交換,可以使9到對應的位置,花費為6+9=15,然後6和7交換,花費為6+7=13,最後等到交換完畢,自最後的答案是什麼呢?就是:
(6+9)+(6+7)+(6+8) = (6+7+8+9)+6∗2 = 30+12 = 42。
剩下乙個環不用交換,那麼當前的最小值就是42,但是這不一定是最優解。
這種策略的解可表示為ans1 = sum + min * (cnt - 1),這裡min是當前環中的最小值,cnt是min與別的元素交換的次數。
策略二:
在這個圖中找到乙個最小的值,然後用這個值跟著當前的環進行交換,在這個圖中很明顯是1,我們讓第1和第二個環中的最小值6進行交換,然後再像上面一樣,交換1和9,花費為:1+9=10,交換1和7,花費為:1+7=8等到交換完畢,最後的結果是:
(1+6)+(1+9)+(1+7)+(1+8)+(1+6) = (6+8+7+9)+1∗5+6 = 41
這種策略的解可表示為ans2 = sum + least * (cnt + 2) + min,這裡least表示所有元素的最小值,min表示當前環中的最小值。
我們的貪心策略就是在這兩個策略之間,找出乙個最小值ans = min(ans1, ans2)。
#include#include#define maxn 50010
using namespace std;
bool visited[maxn]; //記錄該位置的機器是否已經排好序
int least;//記錄最小重量
struct machine
;machine mac[maxn];
bool cmp(machine a, machine b)
long long solve(int i)
return sum + min((long long)min*(cnt-1), (long long)least*(cnt+2)+min);//兩種策略的比較
}int main()
sort(mac+1, mac+n+1, cmp);
least = mac[1].weight;
for(int i=1; i<=n; i++)
}cout << ans << endl;
return 0;
}
1125 交換機器的最小代價(貪心,環)
有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如 3 2 1,交換1 3後為遞增排序,總的交換代價為4。給出n臺機器的重量,求將所有機器變為有序的最小代價。機器的重量均為正整數 輸入...
51nod 1125 交換機器的最小代價
這道題是以前數學專題做過類似的,就是學 置換 的時候 比如 2 3 4 1,就是乙個迴圈,因為第乙個位置是2,然後去找第二個位置,是3,又找第三個位置,是4,又找第四個位置,又回到了1。而4 3 2 1,第乙個位置是4,找第4個位置,是1,找第乙個位置,又是4,所以是個迴圈,同理也是個迴圈 那我們為...
51nod1125 交換機器的最小代價
跟做過的bzoj一道置換群的題幾乎一樣,只是資料範圍大了點,那麼就用map就好了。include include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,...