日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pku 3270 Cow Sorting 置换群

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pku 3270 Cow Sorting 置换群 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://poj.org/problem?id=3270

題意:?

給定N頭牛的身高,要求你通過每次交換兩頭牛的位置使其按身高從小到大排序,身高各不相同。假設交換ai,aj兩頭牛的位置則花費的時間為ai + aj,求用最小的時間花費。

思路:

黑書P248詳細解釋。

cost += sum + Min((k – 2) * ti, ti + (k + 1) * minn);

前一個式子:sum + (k – 2) * ti,ti是所在置換群的最小值

比如:8 4 5 3 2 7

目標? 2 3 4 5 7 8,里邊有兩個置換群(8 2 7)(4 3 5)(這里是每個置換都可以寫成若干互不相交的循環的乘積(黑書P247))

第一個置換群里的ti 是2,第二里ti是3

第一個式子:置換群里要使交換代價最小,必然是每次用最小的那個和其余大的交換

最少交換次數是k – 1, 所以除了ti, 其他元素只各參加一次,所以結果是:sum + (k – 2) * ti

第二個式子: 先用ti和所有n中的最小數minn交換,讓minn執行交換工作,結束后,再把minn和ti交換回來

總共交換了k + 1次,期中k – 1次是初ti的其他數和minn交換,兩次是ti和minn交換

所以結果是:sum + ti + (k + 1) * minn,

比如初始是:1 8 9 7 6

目標是?????? 1 6 7 8 9

分解為(1) (8697),第一種算出來是: 6 + 7 + 8 + 9 + (4 – 2) * 6 = 42

第二種算出來是:6 + 7 + 8 + 9 + 6 + (4 – 1) * 1 = 41 ,

第二種比第一種多交換2次,所以當ti本來就是minn時用第二種會有額外支出,所以二者取小即

總花費cost = sum +?∑min{(ki - 2)*ti,ti + (ki ?+ 1)*m};

ps:這學期開java課了,轉變一下代碼風格。

?

View Code #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <map> #include <string>#define CL(a,num) memset((a),(num),sizeof(a)) #define iabs(x) ((x) > 0 ? (x) : -(x)) #define Min(a,b) (a) > (b)? (b):(a) #define Max(a,b) (a) > (b)? (a):(b)#define ll long long #define inf 0x7f7f7f7f #define MOD 100000007 #define lc l,m,rt<<1 #define rc m + 1,r,rt<<1|1 #define pi acos(-1.0) #define test puts("<------------------->") #define maxn 100007 #define M 100007 #define N 10007 using namespace std; //freopen("din.txt","r",stdin);int a[N],b[N],mp[N*100]; bool vt[N*100]; int main(){//freopen("din.txt","r",stdin);int n,i;scanf("%d",&n);int sum = 0,MIN = inf;for (i = 0; i < n; ++i){scanf("%d",&a[i]);sum += a[i];//求總和MIN = Min(a[i],MIN);//求整個序列的最小值b[i] = a[i];}sort(b,b + n);//b目標序列 a與b形成置換CL(vt,false);CL(mp,0);for (i = 0; i < n; ++i){mp[a[i]] = b[i];//置換后建立關系 }for (i = 0; i < n; ++i){int t = a[i];int len = 0;int tMIN = inf;while (!vt[t]){ //找循環//printf("%d ",t);vt[t] = true;len++;tMIN = Min(tMIN,t);t = mp[t];}if (len > 0){sum += Min((len - 2)*tMIN,tMIN + (len + 1)*MIN);}}printf("%d\n",sum);return 0; }

?

?

?

?

?

總結

以上是生活随笔為你收集整理的pku 3270 Cow Sorting 置换群的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。