51Nod 1125 交換機器的最小代價

2022-05-11 04:36:12 字數 1138 閱讀 2204

題目描述:

有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如:3 2 1,交換1 3後為遞增排序,總的交換代價為4。給出n臺機器的重量,求將所有機器變為有序的最小代價。(機器的重量均為正整數)

解題報告:

1wa,1h20min

這題思路比較清晰,貪心思想:為了最小代價,所以我們盡量交換一次就把當前這個數換到指定的地方.

如果把所有的首先我們離散一遍,然後找到排名為i的數現在所在的位置j,發現如果i到j連邊,就會形成乙個環,我們需要一種方式在乙個環內部進行交換,顯然是選擇最小的那個做為媒介,因為這樣使用次數最多的一定就是最小值,所以最優.

然後我就錯在這裡:

天真的以為已經在原位置的數字就可以不去動它,拍到一組資料發現有時候把環外的乙個點(顯然是環外的最小值)swap到環內,以它為媒介把這個環給排好序,最後再swap回去,這樣反而更優,所以我們可以再加乙個這樣決策,這樣就是對的了

#include #include #include #include #include #include #define rg register

#define il inline

#define iter iterator

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

typedef long long ll;

const int n=50005,inf=1e9+5;

int n,a[n],b[n],m=0,p[n];bool vis[n];

void work()

int cnt=0,x;ll ans=0,re;

for(int i=1;i<=n;i++)p[a[i]]=i;

for(int i=1;i<=n;i++)

ans+=min((ll)re*(cnt-2),(ll)b[1]*(cnt+1)+re);

} printf("%lld\n",ans);

}int main()

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,...

51nod1125 交換機器的最小代價 貪心

1125 交換機器的最小代價 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有n臺機器重量各不相等,現在要求把這些機器按照重量排序,重量從左到右依次遞增。移動機器只能做交換操作,但交換機器要花費一定的費用,費用的大小就是交換機器重量的和。例如 3 2 1,交換1...