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 置换群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python如何实现网络爬虫(Pytho
- 下一篇: 随便写