P1053 篝火晚会

洛谷 p 1053 篝火晚会

至于思路以及代码解释,个人觉得洛谷的题解已经很清楚了,故就不多解释了
有一点不是很清楚,就是如果将c数组的初始值定义为 正:c[0]=1;c[1]=l[1];反:c[0]=1;c[1]=r[1]时会wa一个点,但在我看来好像并没有什么区别,如果有人知道,可以在下面告诉我,万分感谢

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn =50000+10;
inline int read(){
	int ret=0;
	int f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-f;
		}
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		ret=ret*10+(ch^'0');
		ch=getchar();
	}
	return f*ret;
}
int l[maxn];
int r[maxn];
int n;
int c[maxn];
int s[maxn];
int main(){
	freopen("a.in","r",stdin);
	n=read();
//	cin>>n;	
	for(int i=1;i<=n;i++){
	//	cin>>l[i];
		//cin>>r[i];
		l[i]=read();
		r[i]=read();
	}
	c[1]=1;//我们先确定一个点 
	c[2]=l[1];
	for(int i=2;i<=n;i++){
		if((l[l[i]]!=i&&r[l[i]]!=i)||(l[r[i]]!=i&&r[r[i]]!=i)){
			cout<<-1;
			return 0;
		}
		if(i>1)
		if(l[c[i]]==c[i-1])
			c[i+1]=r[c[i]];
		else c[i+1]=l[c[i]]; 
	}
	int ans=n+10;
	for(int i=2;i<=n;i++){
		s[(i-c[i]+n)%n]++;
		ans=min(ans,n-s[(i-c[i]+n)%n]);
	}
	memset(s,0,sizeof(s));
	memset(c,0,sizeof(c));
	c[1]=1;//我们先确定一个点 
	c[2]=r[1];
	for(int i=2;i<=n;i++){
		if(r[c[i]]==c[i-1])
     		c[i+1]=l[c[i]];
		else c[i+1]=r[c[i]]; 
	}
		for(int i=1;i<=n;i++){
			s[(i-c[i]+n)%n]++;
			ans=min(ans,n-s[(i-c[i]+n)%n]);
	}
	cout<<ans; 
	return 0;		
}
原文地址:https://www.cnblogs.com/rpup/p/13528724.html