題目描述
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了「小教官」。在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有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。我們需要佳佳用最少的總代價實現同學們的意願,你能幫助佳佳嗎?
對於30%的資料,n <= 1000;
對於全部的資料,n <= 50000。
輸入格式
輸入的第一行是乙個整數n(3 <= n <= 50000),表示一共有n個同學。其後n行每行包括兩個不同的正整數,以乙個空格隔開,分別表示編號是1的同學最希望相鄰的兩個同學的編號,編號是2的同學最希望相鄰的兩個同學的編號,……,編號是n的同學最希望相鄰的兩個同學的編號。
輸出格式
輸出包括一行,這一行只包含乙個整數,為最小的總代價。如果無論怎麼調整都不能符合每個同學的願望,則輸出-1。
in:4
3 44 3
1 21 2
out:
這個題很坑,題目表意不明。b序列並不是連續的,也不一定是按照遞增順序的。就是在n個人裡隨便挑出幾個人來,讓他們隨便換。。。。。。
所以這樣一來,怎麼換就很明確了,就是讓目標序列的正序n個置換,逆序n個置換,共2n個置換,依次與原數列比較,相同元素最多的那一對,就用總人數減去不相同的人數即可。
但這樣一來,時間複雜度太高了,光產生這2n個序列然後再逐個比較就是個大問題。
但是觀察到,不管這個數列怎麼置換,每兩個元素之間的相對位置是不變的,換句話說,就是同樣的乙個數列,與原數列做差值,然後不管怎麼置換,差值該相同的,置換以後差值也相同,只不過是同時增大了或同時減小了而已。
所以這樣一來,我們就可以把 尋找相同元素數最多 轉化為 尋找相同差值元素數最多。
還有乙個小問題就是這個目標序列怎麼構造以及判-1的問題。開始時沒有想到,光想著拿乙個元素,把它左右挨著放。。然後不知道怎麼模擬,後來發現其實可以拿乙個元素,再取它左邊,如果左邊沒有被加入數列,就加入;否則就尋找右邊。然後把新的這個數當做中心元素,繼續找它的一邊。(只找一邊,像鏈一樣乙個乙個串)。
#include #include using namespace std;
typedef struct edge
edge;
edge e[50005];
int vis[50005], a[50005], b[50005], init[50005], cha[50005];
int main()
a[1] = 1;
vis[1] = 1;
pre = 1;
for(i = 2 ; i <= n ; i++)
else if(vis[e[pre].r] == 0)
else
}if(vis[e[pre].l] != 1 || vis[e[pre].r] != 1 || (e[pre].r != 1 && e[pre].l != 1))
for(i = 1, j = n; i <= n ; i++, j--)
for(i = 1 ; i <= n ; i++)//找正序序列裡差值相同最多的次數
int ans = -1;
for(i = 0 ; i < n ; i++)
for(i = 1 ; i <= n ; i++)//找逆序序列裡差值相同最多的次數
for(i = 0 ; i < n ; i++)
printf("%d\n", n - ans);
return 0;
}
參考:
不懂 篝火晚會
題目描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有 n 個同學,編號從 1 到 n 一開始,同學們按照 1 2 n 的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次...
NOIP2005 篝火晚會
題目 分析 置換群.首先理解題意 b1,b2,bn是無限制的,並非連續,並非遞增,隨便選。於是可以形成若干個環,乙個環的花費是這個環包含的元素個數。所以,最小花費就是多少個人不在應在的位置上。再,多少個人不在應在的位置上 n 最多多少人在應在的位置上。然後,這個可以用偏移量求,求偏移量中包含元素最多...
Noip2005 篝火晚會
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有nnn個同學,編號從111到nnn。一開始,同學們按照1,2,n1,2,n1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整...