時間限制:
2000 ms | 記憶體限制:
65535 kb
難度:6 描述
小明剛進高中,在軍訓的時候,由於小明吃苦耐勞,很快得到了教官的賞識,成為了「小教官」。在軍訓結束的那天晚上,小明被命令組織同學們進行篝火晚會。一共有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。我們需要小明用最少的總代價實現同學們的意願,聰明的小明也有犯傻的時候,你能幫助小明嗎?
n <= 50000。
輸入第一行輸入n(0輸出
每組測試資料報括輸出包括一行,這一行只包含乙個整數,為最小的總代價。如果無論怎麼調整都不能符合每個同學的願望,則輸出-1。
樣例輸入
143 4
4 31 2
1 2
樣例輸出
2
** noip2005
問題可以轉化為最少有多少個同學不在該在的位置上。
首先要知道當乙個人在合法位置上時,呢從頭到尾都不會再移動他,否則必不能組成目標序列,其次就是n個同學坐成乙個環,故需要注意的是並不是當前位置和目標位置的差值為0才是合法位置,你可以隨意從乙個起點開始編號,這道題的思路其實很明顯了,開乙個c陣列構建合法序列,並判定最終不能組成目標序列的條件,這裡其實不難,隨便找乙個點作為起點作為c[1],然後找令他的乙個鄰居作為c[2],開始往後遍歷,c陣列存的下乙個同學的編號一定是當前位置編號為c[i]同學的最終鄰居,若都不是,則肯定不能構成目標序列,還有一種情況是有的同學根本沒在目標序列出現,故肯定不能構成目標序列,剩下的就是記錄所有同學最終位置和初始位置的差值,然後找到某一差值出現的次數最多的,則答案就是n-mx,因為是乙個環,故要考慮反轉的情況。。。
詳解ppt:
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 51005
#define lowbit(x) (x&-x)
#define eps 1e-10
int a[maxn],b[maxn],c[maxn],t1[maxn],t2[maxn];
bool vis[maxn];
int main(void)
{ int t,i,ans,n;
scanf("%d",&t);
while(t--)
{ ans=0;bool flag=0;
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
c[1]=1;c[2]=a[1];
vis[c[1]]=vis[c[2]]=1;
for(i=2;i
NYOJ 開心的小明
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早小明就開始做預算,但是他想買的東西太...
Nyoj 開心的小明49
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早小明就開始做預算,但是他想買的東西太...
NYOJ小明的調查作業
小明的調查作業 時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 小明的老師布置了乙份調查作業,小明想在學校中請一些同學一起做一項問卷調查,聰明的小明為了實驗的客觀性,想利用自己的計算機知識幫助自己。他先用計算機生成了n個1到1000之間的隨機整數 0 輸入 輸入有2行,第1行...