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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

信息学奥赛一本通(1328:【例7.7】光荣的梦想)

發布時間:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通(1328:【例7.7】光荣的梦想) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1328:【例7.7】光榮的夢想


時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 5037 ??? 通過數: 2989

【題目描述】

Prince對他在這片大陸上維護的秩序感到滿意,于是決定啟程離開艾澤拉斯。在他動身之前,Prince決定賦予King_Bette最強大的能量以守護世界、保衛這里的平衡與和諧。在那個時代,平衡是個夢想。因為有很多奇異的物種擁有各種不穩定的能量,平衡瞬間即被打破。KB決定求助于你,幫助他完成這個夢想。

一串數列即表示一個世界的狀態。

平衡是指這串數列以升序排列。而從一串無序數列到有序數列需要通過交換數列中的元素來實現。KB的能量只能交換相鄰兩個數字。他想知道他最少需要交換幾次就能使數列有序。

【輸入】

第一行為數列中數的個數n,第二行為n <= 10000個數。表示當前數列的狀態。

【輸出】

輸出一個整數,表示最少需要交換幾次能達到平衡狀態。

【輸入樣例】

4 2 1 4 3

【輸出樣例】

2

【分析】

? ? ? ? 歸并排序求逆序對。

? ? ? ? 歸并排序:假設我們已經將區間 [L,K] 和區間 [K+1,R] 排好序,則我們可以花費線性的復雜度將區間 [L,R] 排好序。接下來討論從小到大排序(從大到小排序類似)∶

? ? ? ? 若 a[L] < a[K+1](a[L]為區間 [L,K] 第一個元素,a[K+1] 為區間 [K+1,R] 一個元素),則 b[L]=a[L](b[L]為區間 [L,R] 第一個元素),因為區間 [L,K] 是有序的,所以a[L] 是區間[L,K]中最小的元素(同理 a[K+1] 是 [K+1,R] 中最小的元素)。又因為 a[L] < a[K+1],所以 b[L]=a[L](b[L] 是區間 [L,R] 最小的元素)。取出 a[L] 后,a[L+1]又是區間最小的元素,比較 a[L+1] 和 a[K] 決定出區間 [L,R] 中第二小的元素,接下來找出第三小的元素…
得出算法∶
? ? ? ? (1)將區間 [1,n] 進行二分,先求出區間 [1,mid] 和 [mid+1,n] (mid是區間 [1,n] 的中間點),而子區間又進行二分直到區間內只有一個元素(即區間 [I,I],而只有一個元素的區間一定是有序的)。
? ? ? ? (2)將已經排完序的子區間進行合并,即用有序的 [L,K][K+1,R] 求出有序的區間 [L,R],最終合并出區間 [1,N]。而合并區間又分為若干步∶

? ? ? ? ①令變量 I=L,變量 J=K+1,變量 SUM=L,執行下一步。

? ? ? ? ②如果 1<=K 且J<=R(即兩個區間內都有元素),若 a[1] <a[J],則令 b[SUM]= a[1],I=I+1,SUM=SUM+1,執行下一步;若 a[I] >=a[J],則令 b[SUM]=a[J],J=J+1,SUM=SUM+1,執行下一步。如果 I>K或者J≥R(說明其中一個區間內沒有元素了),則將另一個區間剩下的元素都加入 b 數組中,執行下一步。

? ? ? ? ③如果 SUM>R(說明區間 [L,R] 已經排好序),則退出循環,否則執行第 2 步。求逆序對;在合并區間的第二步中∶如果 a[J] < a[1],則說明 a[J] 比區間 [I,K] 中的任何一個元素都小而位置又在J之前,所以提供了(K-I+1)對的逆序對。所以我們只要在合并區間的第二步中加個語句∶if(a[J]<a[1])ans=ans+K-I+1 即可。

【參考代碼】

#include <stdio.h> #define N 10010 int temp[N],a[N],tot; void merge_sort(int left,int right) {int i,j,mid,p;if(left==right)return;mid=(left+right)/2;merge_sort(left,mid);merge_sort(mid+1,right);p=left;i=left;j=mid+1;while(i<=mid && j<=right){if(a[i]>a[j]){tot=tot+mid-i+1;temp[p++]=a[j++];}elsetemp[p++]=a[i++];}while(i<=mid)temp[p++]=a[i++];while(j<=right)temp[p++]=a[j++];for(i=left;i<=right;i++)a[i]=temp[i]; } int main() {int i,n;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);merge_sort(1,n);printf("%d\n",tot);return 0; }

http://ybt.ssoier.cn:8088/problem_show.php?pid=1328

總結

以上是生活随笔為你收集整理的信息学奥赛一本通(1328:【例7.7】光荣的梦想)的全部內容,希望文章能夠幫你解決所遇到的問題。

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