• NOIP2005 篝火晚会


    题目描述 Description

    佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有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。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?

    输入描述 Input Description

    输入第一行是一个整数n(3<=n<=50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。

    输出描述 Output Description

    这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。

    样例输入 Sample Input

    4

    3 4

    4 3

    1 2

    1 2

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint


    【数据规模】



    对于30%的数据,n<=1000;

    对于全部的数据,n<=50000。

     
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    using namespace std;
    const int maxn = 50005;
    int n,gay[maxn][2],sb[maxn],sum[maxn],dis[maxn],ans = 0;;
    bool vis[maxn];
    void input(){
        ios::sync_with_stdio(false);
        cin>>n;
        for(int i = 1;i <= n;i++){
            cin>>gay[i][0]>>gay[i][1];
        }
    }
    void solve(){
        int last,now,tmp;
        for(int i = 1;i <= n;i++){
            if(i == 1){
                now = 1;
                sb[i] = now;
                last = now;
                now = gay[last][0];
            }else{
                if(now == last){
                    cout<<-1;
                    exit(0);
                }
                sb[i] = now;
                tmp = now;
                now = (gay[now][0] == last ? gay[now][1] : gay[now][0]);
                last = tmp; 
            }
        }
        if(now != 1){
            cout<<-1;
            exit(0);
        }
        int maxv = 0;
        //for(int i = 1;i <= n;i++) cout<<sb[i]<<" ";
        for(int i = 1;i <= n;i++){
            if(sb[i] == i){
                dis[0]++;
                maxv = max(dis[0],maxv);    
            }
            if(i < sb[i]){
                 dis[i+n-sb[i]]++;
                 maxv = max(dis[i+n-sb[i]],maxv);
            }
            if(i > sb[i]){
                 dis[i-sb[i]]++;
                 maxv = max(dis[i-sb[i]],maxv);
            }
        }
        ans = n-maxv;
        return;
    }
    void solve2(){
        memset(sb,0,sizeof(sb));
        memset(dis,0,sizeof(dis));
        int last,now,tmp;
        for(int i = 1;i <= n;i++){
            if(i == 1){
                now = 1;
                sb[i] = now;
                last = now;
                now = gay[last][1];
            }else{
                if(now == last){
                    cout<<-1;
                    return;
                }
                sb[i] = now;
                tmp = now;
                now = (gay[now][0] == last ? gay[now][1] : gay[now][0]);
                last = tmp; 
            }
        }
        if(now != 1){
            cout<<-1;
            return;
        }
        int maxv = 0;
        //for(int i = 1;i <= n;i++) cout<<sb[i]<<" ";
        for(int i = 1;i <= n;i++){
            if(sb[i] == i){
                dis[0]++;
                maxv = max(dis[0],maxv);    
            }
            if(i < sb[i]){
                 dis[i+n-sb[i]]++;
                 maxv = max(dis[i+n-sb[i]],maxv);
            }
            if(i > sb[i]){
                 dis[i-sb[i]]++;
                 maxv = max(dis[i-sb[i]],maxv);
            }
        }
        ans = min(n-maxv,ans);
        cout<<ans;
        return;
    }
    int main(){
        input();
        solve();
        solve2();
        return 0;
    }
  • 相关阅读:
    React Native基础&入门教程:以一个To Do List小例子,看props和state
    Xamarin 学习笔记
    网站HTTP升级HTTPS完全配置手册
    Xamarin 学习笔记
    Xamarin 学习笔记
    React Native基础&入门教程:初步使用Flexbox布局
    SpreadJS使用进阶指南
    用WijmoJS搭建您的前端Web应用 —— React
    【图解】FlexGrid Explorer 全功能问世
    只用最适合的!全面对比主流 .NET 报表控件
  • 原文地址:https://www.cnblogs.com/hyfer/p/5852332.html
Copyright © 2020-2023  润新知