Time Limit: 1 second

Memory Limit: 50 MB

【问题描述】

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有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+1行;
第一行是一个整数n(3 <= n <= 50000),表示一共有n个同学。
每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。

【输出】

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

【输入样例】

4
3 4
4 3
1 2
1 2

【输出样例】

2

【 数据规模】

30%的数据满足:n <= 1000;
100%的数据满足:n <= 50000。

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=b503

【题解】



首先,需要通过给出的n个人的需求;

判断出每个人的位置;

这里根据所给的关系,得出每个人的度数;

显然,构成一个环的要求是,每个人的度数都为2;

但是这样还不够,还得n个点都是联通的才行;不然两个独立的环

每个人的度数也都是2,但是不符合要求的;

然后根据输入得出这张换的一维形式;

即a[i]=t;表示第i个位置的人是t;

又一开始a[i]=i;

则先找出一开始不在自己位置上的人的个数y;

根据那个规则可以猜测y就是答案了;

但是这里一个环转换成一维的形式有N种;

你得算出每一种,不在自己位置上的人的个数;

然后求出最小值;

这里有一个思维的过程;

即先求出在自己位置上的人的最大个数的序列;

然后用n减去这个最大个数;

剩下的就是不在自己位置上的人数最小的人数了;

这个在自己位置上的人的最大个数可以通过偏移量来算;



随便选一个一维序列

b[1],b[2]…b[n];

表示第i个人要到哪一个位置;

然后对于每一个人

dic[b[i]-i]++;

这就表示第i个人从它原来的位置到它想要的位置需要把整个序列移动多少;

然后找最大的dic;

这个dic就是在自己想要在的位置上的人数的最大值;

因为有x个人他需要偏移dic[x]个位置就能回到自己的位置上,那么就整体把这个序列偏移dic[x]个位置就好;

假设N=7



向左偏移2格就相当于向右移动5格;

所以对于b[i]-i小于0的情况,直接加上n就好

即dic[(b[i]-i+n)%n]++;

然后再把这个随便选的环化线的序列b翻转一下(用reverse函数倒序一下就好);

再做一下上述过程;

因为我们只是左右偏移,还没办法覆盖翻转的情况;

所以还要再翻转一下才能把所有的情况都考虑到;

最后用n减去那个值就是答案了;



【完整代码】

#include <map>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 50000+100; int a[MAXN][2],du[MAXN],b[MAXN],cnt,n;
bool bo[MAXN];
map <int,int> dic; int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);
rep1(i,1,n)
{
rei(a[i][0]),rei(a[i][1]);
du[a[i][0]]++,du[a[i][1]]++;
}
rep1(i,1,n)
if (du[i]!=2)
{
puts("-1");
return 0;
}
int now = cnt = 1;
b[1] = now;
bo[1] = true;
while (cnt < n)
{
int x = a[now][0];
if (bo[x])
x = a[now][1];
if (bo[x])//如果往两个方向走都是走过的点
{//而且还没有走满n个点,就说明有多个独立的环
puts("-1");
return 0;
}
bo[x] = true;
now = x;
b[++cnt] = x;
}
rep1(i,1,n)
dic[(b[i]-i+n)%n]++;
int num = 0;
rep1(i,0,n-1)
num = max(num,dic[i]);
dic.clear();
reverse(b+1,b+1+n);
rep1(i,1,n)
dic[(b[i]-i+n)%n]++;
rep1(i,0,n-1)
num = max(num,dic[i]);
printf("%d\n",n-num);
return 0;
}

【b503】篝火晚会的更多相关文章

  1. NOIP2005 篝火晚会 解题报告

    佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照1,2,… ...

  2. NOIP2005 篝火晚会

    篝火晚会 (fire.pas/c/cpp) [问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会. ...

  3. [NOIP 2005]-- 篝火晚会

    额~~,对这组题感兴趣的具体的解题报告可以戳戳这里:http://wenku.baidu.com/view/878beb64783e0912a2162aa7.html?qq-pf-to=pcqq.c2 ...

  4. 洛谷 P1053 篝火晚会 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  5. [LuoguP1053][Noip2005]篝火晚会

    [LuoguP1053][Noip2005]篝火晚会(Link) 现在你有一个排成一个圈的\(N\)大小的队列,一开始的顺序是\(\{1,2,3,4...N\}\),一共有\(N\)个要求,第\(i\ ...

  6. P1053 篝火晚会

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有nnn个同学,编号从111到nnn.一开始 ...

  7. 洛谷P1053 篝火晚会

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到 ...

  8. 「NOIP2005」「Codevs1106」篝火晚会

    题目描述 Description 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1 ...

  9. [NOIP2005] 提高组 洛谷P1053 篝火晚会

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...

随机推荐

  1. PyChram创建虚拟环境

    目录 1. python创建虚拟环境 2. pycharm中添加python虚拟环境 1. python创建虚拟环境 首先要安装virtualenv模块.打开命令行,输入pip install vir ...

  2. jmeter的运行原理和测试计划要素

    jmeter运行原理 1.jmeter运行在JVM虚拟机上,jmeter是以线程的方式运行的. 2.jmeter通过线程组来驱动多个线程,运行测试脚本对被测试服务器发起负载,每一个负载机上够可以运行多 ...

  3. Leetcode747.Largest Number At Least Twice of Others至少是其他数字两倍的最大数

    在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums = [3, ...

  4. 运行docker容器镜像2(指定容器启动时启动的脚本)

    docker中启动容器有以下两种情况. 第一种是通过 # docker run containerid 启动一个容器. 第二种是重新启动已经关闭的容器. # docker start containe ...

  5. Servlet会话跟踪和Cookies及HttpSession会话

    会话只是指一段指定的时间间隔. 会话跟踪是维护用户状态(数据)的一种方式.它也被称为servlet中的会话管理. Http协议是一个无状态的,所以我们需要使用会话跟踪技术来维护用户状态. 每次用户请求 ...

  6. docker+jenkins的实现方式(ps.使用dockerfile的方式)!

    继http://www.cnblogs.com/guilty/p/4747993.html之后. 前两天朋友问的,docker+jenkins整合. 我也没搞过,但是正好最近有空,我也很有兴趣,就搞一 ...

  7. Libevent:0异步IO简介

    一:异步IO简介 大多数的初级编程者都是从阻塞IO调用开始网络编程的.阻塞(同步)IO调用指的是:调用会一直阻塞,不会返回,直到发生下面两种情况之一.要么操作完成,要么经历相当长的时间,网络协议栈自己 ...

  8. @codeforces - 1214G@ Feeling Good

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n*m 的 01 矩阵 A,一开始所有格子都为 0. ...

  9. python 操作asdl

    #!/usr/bin/env python# -*- coding:utf-8 -*- import win32ras import time,os def Connect(dialname, acc ...

  10. BUAA 623 Chem is Try!

    http://oj55.bianchengla.com/problem/623/ 好久没写过题解了,昨天做了一道挺恶心的题目,贴一下代码上来.看了一下提交状况,好像我的代码挺短的了,至少我找不到比我短 ...