額~~,對這組題感興趣的具體的解題報告可以戳戳這裡:
【問題描述】
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了「小教官」。在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有n個同學,編號從1到n。一開始,同學們按照1,2,……,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次序,形成新的乙個圈,使之符合同學們的意願,成為擺在佳佳面前的一大難題。
佳佳可向同學們下達命令,每乙個命令的形式如下:
(b1, b2,... bm -1, bm)
這裡m的值是由佳佳決定的,每次命令m的值都可以不同。這個命令的作用是移動編號是b1,b2,…… bm –1,bm的這m個同學的位置。要求b1換到b2的位置上,b2換到b3的位置上,……,要求bm換到b1的位置上。
執行每個命令都需要一些代價。我們假定如果乙個命令要移動m個人的位置,那麼這個命令的代價就是m。我們需要佳佳用最少的總代價實現同學們的意願,你能幫助佳佳嗎?
【輸入檔案】
輸入檔案fire.in的第一行是乙個整數n(3 <= n <= 50000),表示一共有n個同學。其後n行每行包括兩個不同的正整數,以乙個空格隔開,分別表示編號是1的同學最希望相鄰的兩個同學的編號,編號是2的同學最希望相鄰的兩個同學的編號,……,編號是n的同學最希望相鄰的兩個同學的編號。
【輸出檔案】
輸出檔案fire.out包括一行,這一行只包含乙個整數,為最小的總代價。如果無論怎麼調整都不能符合每個同學的願望,則輸出-1。
【樣例輸入】
43 4
4 31 2
1 2【樣例輸出】
2【資料規模】
對於30%的資料,n <= 1000;
對於全部的資料,n <= 50000。
解題思路:
由原來的環可以得到乙個目標序列列舉可能的2*n個不同的序列,比如1 2 3 4 5 6 7 8
1 8 2 7 5 3 6 4 10 9、8 2 7 5 3 6 4 10 9 1、2 7 5 3 6 4 10 9 1 8、
7 5 3 6 4 10 9 1 8 2、5 3 6 4 10 9 1 8 2 7、……及9 10 4 6 3 5 7 2 8 1
1 9 10 4 6 3 5 7 2 8、8 1 9 10 4 6 3 5 7 2、2 8 9 10 4 6 3 5 7、……。
將每個目標序列都與初始序列作比較,計算出目標序列與初始序列有多少個元素的位置已相同
(位置已相同的就不必移動,其它的都得移動,最少總代價就是得移動的只移動一次),
所以,問題就是求目標序列與初始序列最多有多少個(記為max)元素的位置已相同,則(n-max)就是所要求的最少總代價。
按上述演算法編寫程式,可以正確求出各組測試資料的結果,但當n=50000時,程式執行的時間約為40s~60s,果斷超時~~~
那麼如何快速求出目標環與初始環間最多有多少個元素的位置可能相同,就是ac本題的關鍵~~
關於求目標序列和原序列的最多等價元素個數的辦法如下:
只要求出目標環各元素值與初始環對應位置的元素值之差的結果相同的最多是多少個就可以了
為使差值為正數,可用用(a[i]-b[i]+n)%n
來求差值(b[i]表示初始序列,實際就是12345……n)
同時注意因為是乙個環,那麼與方向無關,所以順時針,逆時針我們都用上述方法求解一次
**如下:
1 #include 2 #includeview code3int map[50005][2], ptr[50005], vis[50005], mpt[50005
], n, flag;45
void
mergy()16}
17}1819
intsolve()
26for (i = 0; i)
27 maxn = maxn>ptr[i] ?maxn : ptr[i];
28 memset(ptr, 0, sizeof
(ptr));
29for (i = 0; i < n; i++)
33for (i = 0; i)
34 maxn = maxn>ptr[i] ?maxn : ptr[i];
35return n -maxn;36}
3738
intmain()
NOIP2005 篝火晚會
題目 分析 置換群.首先理解題意 b1,b2,bn是無限制的,並非連續,並非遞增,隨便選。於是可以形成若干個環,乙個環的花費是這個環包含的元素個數。所以,最小花費就是多少個人不在應在的位置上。再,多少個人不在應在的位置上 n 最多多少人在應在的位置上。然後,這個可以用偏移量求,求偏移量中包含元素最多...
Noip2005 篝火晚會
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有nnn個同學,編號從111到nnn。一開始,同學們按照1,2,n1,2,n1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整...
NOIp2005 篝火晚會
luogu1053 首先要發現乙個事實 對於每個不再正確位置上的人,我們都要花費1的代價來讓他正確 然而我沒有發現 todo 證明這個事實。然後就可以轉化問題為 最多有多少個人不用動。那麼那些人不用動呢?就是那些與目標位置距離相等的人的集合,即斷環為鏈之後,不用右移就在目標位置的人 右移一次到達目標...