【題目描述】
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了「小教官」。在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有 n 個同學,編號從 1 到 n 。一開始,同學們按照 1 , 2 ,……, n 的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次序,形成新的乙個圈,使之符合同學們的意願,成為擺在佳佳面前的一大難題。
佳佳可向同學們下達命令,每乙個命令的形式如下:
(b 1 , b 2 ,... b m -1 , b m )
這裡 m 的值是由佳佳決定的,每次命令 m 的值都可以不同。這個命令的作用是移動編號是 b 1 , b 2 ,…… b m –1 , b m 的這 m 個同學的位置。要求 b 1 換到 b 2 的位置上, b 2 換到 b 3 的位置上,……,要求 b m 換到 b 1 的位置上。
執行每個命令都需要一些代價。我們假定如果乙個命令要移動 m 個人的位置,那麼這個命令的代價就是 m 。我們需要佳佳用最少的總代價實現同學們的意願,你能幫助佳佳嗎?
【輸入格式】
輸入檔案 的第一行是乙個整數 n ( 3 <= n <= 50000 ),表示一共有 n 個同學。其後 n 行每行包括兩個不同的正整數,以乙個空格隔開,分別表示編號是 1 的同學最希望相鄰的兩個同學的編號,編號是 2 的同學最希望相鄰的兩個同學的編號,……,編號是 n 的同學最希望相鄰的兩個同學的編號。
【輸出格式】
輸出檔案 包括一行,這一行只包含乙個整數,為最小的總代價。如果無論怎麼調整都不能符合每個同學的願望,則輸出 -1 。
【樣例輸入】
4
3 4
4 3
1 2
1 2
【樣例輸出】
2【分析】
什麼群論之類的東西。不懂。
#include #include #define maxn 50010int time[maxn],a[maxn],b[maxn],c[maxn];
int n,ans;
int main()
if (c[n] != b[1])
for (int i = 1;i <= n;++i)
for (int i = 0;i < n;++i)
if (time[i] > ans)
ans = time[i];
memset(time,0,sizeof(time));
for (int i = 1;i <= n;++i)
for (int i = 0;i < n;++i)
if (time[i] > ans)
ans = time[i];
printf("%d\n",n - ans);
return 0;
}
RQNOJ 篝火晚會
題目描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有n個同學,編號從1到n。一開始,同學們按照1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整同學的次序,形成新的乙...
NOIP2005 篝火晚會
題目 分析 置換群.首先理解題意 b1,b2,bn是無限制的,並非連續,並非遞增,隨便選。於是可以形成若干個環,乙個環的花費是這個環包含的元素個數。所以,最小花費就是多少個人不在應在的位置上。再,多少個人不在應在的位置上 n 最多多少人在應在的位置上。然後,這個可以用偏移量求,求偏移量中包含元素最多...
Noip2005 篝火晚會
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有nnn個同學,編號從111到nnn。一開始,同學們按照1,2,n1,2,n1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命令調整...