记录编号 27888 评测结果 AAAAAAAAAA
题目名称 [NOIP 2005]篝火晚会 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.381 s
提交时间 2011-10-09 21:48:30 内存使用 0.74 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef unsigned short int fire[50001];

fire l;//每個人期望的左邊的人
fire r;//每個人期望的右邊的人
fire a;//目標狀態,正序
fire b;//目標狀態,倒序
fire ans; 
int n;

void printab()
{
	for (int i=1;i<=n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	for (int i=1;i<=n;i++)
		cout<<b[i]<<" ";
}

bool init()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		scanf("%d%d",&l[i],&r[i]);
	fclose(stdin);
	
	//判斷該是否成環
	for (int i=1;i<=n;i++)
	{
		if ( ( l[l[i]]!=i && r[l[i]]!=i ) || ( l[r[i]]!=i && r[r[i]]!=i ) )
		{
			return false;
		}
	}
	return true;
}

void compute()
{
	int mt=0;
	for (int i=1;i<=n;i++)
	{
		ans[ (a[i]+n-i)%n ]++;
		if(mt<ans[(a[i]+n-i)%n])
			mt=ans[(a[i]+n-i)%n];
	}
	memset(ans,0,sizeof(ans));
	
	for (int i=1;i<=n;i++)
	{
		ans[ (b[i]+n-i)%n ]++;
		if(mt<ans[(b[i]+n-i)%n])
			mt=ans[(b[i]+n-i)%n];
	}
	printf("%d\n",n-mt);
	return;
}

void construct()
{
	//如果成環,則構造目標狀態
	a[1]=1;
	for (int i=2;i<=n;i++)
	{
		if (a[i-2]==l[a[i-1]])
			a[i]=r[a[i-1]];
		else
			a[i]=l[a[i-1]];
	}
	//把a倒過來
	for (int i=1;i<=n;i++)
		b[n-i+1]=a[i];
	
	//printab();
	//cout<<endl;
	compute();
	return;
}

int main()
{
	freopen("fire.in","r",stdin);
	freopen("fire.out","w",stdout);
	if(init())
		construct();
	else
		printf("-1\n");
	fclose(stdout);
	return 0;
}