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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 3270

發布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 3270 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

省賽被虐了,最近就搞搞數論和組合數學的題目。

這題主要運用了組合數學中的置換群概念,其他也沒什么好說的了。

1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 #define MAXN 10005 7 using namespace std; 8 int data[MAXN],note[MAXN]; 9 bool vis[MAXN]; 10 11 int search(int n, int x) 12 { 13 int l(1),r(n); 14 int mid = (l + r)/2; 15 while (l <= r) { 16 if (note[mid] == x)return mid; 17 if (note[mid] < x)l = mid + 1; 18 if (note[mid] > x)r = mid - 1; 19 mid = (l + r)/2; 20 } 21 return 0; 22 } 23 24 void ini(int n) 25 { 26 memset(vis,false,sizeof(vis)); 27 for (int i(1); i<=n; ++i) { 28 scanf("%d",&data[i]); 29 note[i] = data[i]; 30 } 31 sort(note+1,note+n+1); 32 for (int i(1); i<=n; ++i) { 33 data[i] = search(n+1,data[i]); 34 } 35 } 36 37 int main() 38 { 39 int n; 40 scanf("%d",&n); 41 ini(n); 42 priority_queue<int, vector<int>, greater<int> > Q; 43 int sum1(0), sum2(0), ans = 0; 44 for (int i(1); i<=n; ++i) { 45 if (!vis[i]) { 46 sum1 = sum2 = 0; 47 vis[i] = true; 48 Q.push(i); 49 int temp = i; 50 sum1 += 2*note[i] + 2*note[1]; 51 while (!vis[data[temp]]) { 52 temp = data[temp]; 53 vis[temp] = true; 54 sum1 += note[temp] + note[1]; 55 Q.push(temp); 56 } 57 if (Q.size() == 1) { 58 Q.pop(); 59 continue; 60 } 61 int x = Q.top();//cout<<x<<" "; 62 Q.pop(); 63 while (!Q.empty()) { 64 //cout<<Q.top()<<" "; 65 sum2 += note[x] + note[Q.top()]; 66 Q.pop(); 67 } 68 //cout<<sum1<<" "<<sum2<<endl; 69 ans += min(sum1,sum2); 70 } 71 } 72 cout<<ans<<endl; 73 system("pause"); 74 return 0; 75 }

轉載于:https://www.cnblogs.com/devtang/archive/2012/05/23/2514647.html

總結

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

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