本質就是算逆序對數。
n個降序排列的數能提供 (n-1)*n/2 個逆序對,這是n個數能創造出的最多逆序對數。
那如何排列出任意m個逆序對呢?
顯然第一步是找出能覆蓋 m 的最小 n 來,即 (n-1)*n/2 >= m。
n 能覆蓋,那麼 n-1 就不能覆蓋 m,而 m 與 n-1 的覆蓋 之間的差值 dis = m-(n-1)*(n-2)/2,如何填補?
這個差值 dis 應由頭位數與後面數字交換得到,。
舉例好理解: 1 2 3 4 5 五位數 想創造出5個逆序
此時 n 算得為4 : (n-1)*n/2=6 >= (m=5) -> n=4 可知這逆序對要由最後後4位數創造
而 dis = m-(n-1)*(n-2)/2 = 5 - 3 = 2 三位全降序只能創造3個逆序,仍然差2位
那麼我們將 2 與 4 交換 那麼4就在頭位了,4就創造出2個逆序了。
再對尾部 n-1 個數降序sort一下,就剛好創造出 2+3 個逆序了。
// head files excluded
using
namespace
std;
int n,m;
int cot[50001];
int main()
if(bar!=0)else sort(cot+n-k+1, cot+1+n ,greater());
for(int i=1;i<=n;i++) cout
<" ";
return
0;}
P1338 末日的傳說
首先審題,題目中提到 每次它都生成乙個以前未出現過的 最小 的排列。其實這句話的意思就是說,我這個日期每天都會變化,每次變化後的排列都是以前沒出現過的,也就是不會有重複的排列,然後這個日期還是除了以前出現過的排列之外的最小的排列,也就是說啊,我這個日期是按照一定規律來變化的,第一天是字典序最小,第二...
洛谷P1338(末日的傳說)
只要是參加jsoi活動的同學一定都聽說過hanoi塔的傳說 三根柱子上的金片每天被移動一次,當所有的金片都被移完之後,世界末日也就隨之降臨了。在古老東方的幻想鄉,人們都採用一種奇特的方式記錄日期 他們用一些特殊的符號來表示從1開始的連續整數,1表示最小而n表示最大。創世紀的第一天,日曆就被賦予了生命...
洛谷P1338 末日的傳說
qaq本來不是多難的題,然鵝我折騰了半天。看到乙個挺不錯的想法 我們知道,對於乙個長度為n的序列而言,其最大的逆序對的個數為n n 1 2,題目是要求乙個逆序數為m的字典序最小的序列。那我們不妨從1開始考慮每乙個數的排列,這樣每次考慮的都是當前最小的數 如果把這個數放在最前面,而剩下的數的排列的逆序...