佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了「小教官」。在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有nnn個同學,編號從111到nnn。一開始,同學們按照1,2,…,n1,2,…,n1,2,…,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次序,形成新的乙個圈,使之符合同學們的意願,成為擺在佳佳面前的一大難題。
佳佳可向同學們下達命令,每乙個命令的形式如下:
(b1,b2,...bm−1,bm)(b_1, b_2,... b_, b_m)(b1,b2,...bm−1,bm)
這裡mmm的值是由佳佳決定的,每次命令mmm的值都可以不同。這個命令的作用是移動編號是b1,b2,…,bmb_1,b_2,…, b_mb1,b2,…,bm的這m個同學的位置。要求b1b_1b1換到b2b_2b2的位置上,b2b_2b2換到b3b_3b3的位置上,……,要求bmb_mbm換到b1b_1b1的位置上。執行每個命令都需要一些代價。我們假定如果乙個命令要移動mmm個人的位置,那麼這個命令的代價就是mmm。我們需要佳佳用最少的總代價實現同學們的意願,你能幫助佳佳嗎?
輸入格式:
第一行是乙個整數n(3≤n≤50000)n(3 \le n \le 50000)n(3≤n≤50000),表示一共有nnn個同學。
其後nnn行每行包括222個不同的正整數,以乙個空格隔開,分別表示編號是111的同學最希望相鄰的兩個同學的編號,編號是222的同學最希望相鄰的兩個同學的編號,……,編號是nnn的同學最希望相鄰的兩個同學的編號。
輸出格式:
乙個整數,為最小的總代價。如果無論怎麼調整都不能符合每個同學的願望,則輸出−1-1−1。
輸入樣例#1:複製
43 44 3
1 21 2
輸出樣例#1:複製
2
對於30%的資料,n≤1000n \le 1000n≤1000;
對於全部的資料,n≤50000n \le 50000n≤50000。
2005提高組第三題
又被noip題吊打了。
可以看出最小代價等於不在應該在的位置上的數的個數的最小值。
於是我們可以列舉開始位置,還有兩個方向,列舉結束時的目標環,求出不在應該在的位置上的數的最小個數就是答案。
但是這樣是$\large o(n^2)$的會t,所以找規律。
我們固定起始序列,任取乙個目標序列,求出每乙個位置到它應該到的位置的步數,發現,不管目標序列是什麼樣子,相同的就一直相同,不同的就一直不同。
所以我們把答案變成n-最多的不用動的數量。
然後發現其實距離應到的位置距離相同的最大的數量, 就是最多不用動的數量。
所以這樣就可以$\large o(n)$求出。
記得正反都跑一遍。
#include #include#include
using
namespace
std;
#define reg register inline
intread()
#define n 50005
intn;
int deg[n], ch[n][2
];int
l[n], r[n];
int cnt[2
][n];
inta[n];
intmain()
for (reg int i = 1 ; i <= n ; i ++) if (deg[i] != 2) return puts("
-1"), 0
;
int p = 1, num = 0
; l[
1] = ch[1][0], r[1] = ch[1][1
];
dowhile(p != 1
);
if (num != n) return puts("
-1"), 0
; p = 1
;
for (reg int i = 1 ; i <= n ; i ++, p =r[p])
cnt[
0][(i-p+n)%n]++;
p = 1
;
for (reg int i = 1 ; i <= n ; i ++, p =l[p])
cnt[
1][(i-p+n)%n]++;
int ans = 0
;
for (reg int i = 0 ; i < n ; i ++)
ans = max(ans, max(cnt[0][i], cnt[1
][i]));
printf(
"%d\n
", n -ans);
return0;
}
NOIP2005 篝火晚會
題目 分析 置換群.首先理解題意 b1,b2,bn是無限制的,並非連續,並非遞增,隨便選。於是可以形成若干個環,乙個環的花費是這個環包含的元素個數。所以,最小花費就是多少個人不在應在的位置上。再,多少個人不在應在的位置上 n 最多多少人在應在的位置上。然後,這個可以用偏移量求,求偏移量中包含元素最多...
NOIP 2005 篝火晚會
額 對這組題感興趣的具體的解題報告可以戳戳這裡 問題描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有n個同學,編號從1到n。一開始,同學們按照1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望...
NOIp2005 篝火晚會
luogu1053 首先要發現乙個事實 對於每個不再正確位置上的人,我們都要花費1的代價來讓他正確 然而我沒有發現 todo 證明這個事實。然後就可以轉化問題為 最多有多少個人不用動。那麼那些人不用動呢?就是那些與目標位置距離相等的人的集合,即斷環為鏈之後,不用右移就在目標位置的人 右移一次到達目標...