zoukankan      html  css  js  c++  java
  • 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;		
    }
    
  • 相关阅读:
    十一.状态设计模式
    十. 享元设计模式
    Orcale(一)概念
    java类加载器
    spring中的事务管理机制
    spring中的annotation注解类配置
    countDownLatch和Semaphore用于多线程
    布隆过滤器
    mybatis-genator自动生成的mapper中模糊查询使用方法
    java中的异常
  • 原文地址:https://www.cnblogs.com/rpup/p/13528724.html
Copyright © 2011-2022 走看看