洛谷 P1338 末日的傳說 解題報告

2022-04-30 04:33:11 字數 1042 閱讀 4615

只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說:三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。

在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期:他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命,它自動地開始計數,就像排列不斷地增加。

我們用1-n來表示日曆的元素,第一天日曆就是

1, 2, 3, … n

第二天,日曆自動變為

1, 2, 3, … n, n-1

……每次它都生成乙個以前未出現過的「最小」的排列——把它轉為n+1進製後數的數值最小。

日子一天一天地過著。有一天,一位預言者出現了——他預言道,當這個日曆到達某個上帝安排的時刻,這個世界就會崩潰……他還預言到,假如某乙個日期的逆序達到乙個值m的時候,世界末日就要降臨。

什麼是逆序?日曆中的兩個不同符號,假如排在前面的那個比排在後面的那個更大,就是乙個逆序,乙個日期的逆序總數達到m後,末日就要降臨,人們都期待乙個賢者,能夠預見那一天,到底將在什麼時候到來?

只包含一行兩個正整數,分別為n和m。

輸出一行,為世界末日的日期,每個數字之間用乙個空格隔開。

對於10%的資料有n <= 10。

對於40%的資料有n <= 1000。

對於100%的資料有 n <= 50000。

所有資料均有解。

神仙題,我大概玩了半個多小時才玩出來

首先我們發現沒必要關係它動了多少次。

然後我們發現只要某\(k\)位移動時,它在最大逆序對數是\(k \times (k-1) /2\),且它在移動時是最後達成的(也就是說,達到最大逆序對數後的下一次移動就要下一位了)

繼續玩發現如果逆序對數夾在某兩位之間,一定會被右邊一位的最大逆序對貢獻(因為它先),然後我們根據超過的值給左邊安排乙個就行了

code:

#include int main()

while(cnt+n-pos<=m);

for(int i=1;i2018.7.27

洛谷P1338(末日的傳說)

只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命...

洛谷P1338 末日的傳說

qaq本來不是多難的題,然鵝我折騰了半天。看到乙個挺不錯的想法 我們知道,對於乙個長度為n的序列而言,其最大的逆序對的個數為n n 1 2,題目是要求乙個逆序數為m的字典序最小的序列。那我們不妨從1開始考慮每乙個數的排列,這樣每次考慮的都是當前最小的數 如果把這個數放在最前面,而剩下的數的排列的逆序...

洛谷P1338 末日的傳說

只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命...