超詳細題解 旋轉子段

2022-05-25 12:18:12 字數 906 閱讀 6823

題目描述:

zyl有n張牌編號分別為1, 2,……,n。他把這n張牌打亂排成一排,然後他要做一次旋轉使得旋轉後固定點盡可能多。如果第i個位置的牌的編號為i,我們就稱之為固定點。旋轉可以被認為是將其中的乙個子段旋轉180度,這意味著子段的第一張牌和最後一張牌交換位置,以及第二張牌和倒數第二張牌交換位置,等等。寫乙個程式,找到旋轉子段(子段長度可以為1)。

題解:

機房大佬人均o(nlogn)做法,只有我最菜,我只會o(n)做法

很容易想到o(n)做法。輸入時,用c陣列記錄原本就是固定點的個數的字首和,再用b陣列記錄以某個位置為中心旋轉後可以得到的固定點個數(並沒有算旋轉後原本固定點個數的變化),然後列舉以i為旋轉邊緣,計算旋轉後的固定點個數,這樣就可以很愉快地拿到45分。

重新整理了一下思路,發現有兩個漏洞:

1.乙個位置被列舉後,它的b陣列要減一(這麼明顯的錯誤我竟然一開始沒發現tat),這樣可以拿到85分。

2.既然被列舉後b陣列要減一,那麼就要以某位置為旋轉中心按順序列舉,這時就要用ai陣列記錄每個數的位置,列舉的旋轉邊緣不僅有i,還有ai[i],如果此時還每次都計算的話,b陣列就會被重複減,我們分情況討論:

若i若i當前列舉的數比它的位置小,為第一次被列舉到,需要計算。

其餘情況不需要計算。

舉個栗子:3 4 5 2 1

當i=1時,3和1需要旋轉,b[2]--,b[3]--。

當i=2時,4和2需要旋轉,b[3]--,b[3]--。

當i=3時,5需要旋轉,b[4]--。

當i=4和5時,不需要旋轉。

為了避免出現小數,將數列長度乘二,數字乘二,偶數字置為數字,奇數字置為空。

ac**如下:

fox's code

༄༊第一次寫題解,還請多多指教

考題 列舉 旋轉子段 列舉 推導優化

zyl有n張牌編號分別為1,2,n。他把這n張牌打亂排成一排,然後他要做一次旋轉使得旋轉後固定點盡可能多。如果第i個位置的牌的編號為i,我們就稱之為固定點。旋轉可以被認為是將其中的乙個子段旋轉180度,這意味著子段的第一張牌和最後一張牌交換位置,以及第二張牌和倒數第二張牌交換位置,等等。寫乙個程式,...

jzoj6288 旋轉子段 優雅的暴力

乙個長度為n nn的序列。可以選擇一段區間旋轉,求使得 i 1n a i i sum n a i i i 1n ai i 最大。現在序列中每隔乙個插入乙個 號 偽插入 用g ig gi 表示以中點為i ii的序列翻轉後能夠對應的數字。然後列舉中心點,然後從短到長列舉翻轉可以對應的陣列,然後統計答案。...

九校2D2T1 旋轉子段

zyl有n張牌編號分別為1,2,n。他把這n張牌打亂排成一排,然後他要做一次旋轉使得旋轉後固定點盡可能多。如果第i個位置的牌的編號為i,我們就稱之為固定點。旋轉可以被認為是將其中的乙個子段旋轉180度,這意味著子段的第一張牌和最後一張牌交換位置,以及第二張牌和倒數第二張牌交換位置,等等。寫乙個程式,...