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

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

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

输入格式 Input Format
  输入的第一行是一个整数n(3 <= n <= 50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。
输出格式 Output Format
  输出包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。
样例输入 Sample Input

4
3 4
4 3
1 2
1 2

样例输出 Sample Output

2

时间限制 Time Limitation
1s

刚看这道题的时候确实有些懵,题意大概就是有一个原序列和目标序列,给你一种移动方式,求转化为目标序列的最小代价,
然后想什么dp搜索发现都不行。
然后就偷偷看了下是模拟qwq,然后就开始我奇怪的模拟猜想。
不管会不会,反正-1的分肯定是要拿的。判断不符合的方法很简单,对于两个同学a ,b,如果a想和b在相邻坐,而b却对a一点想法也没有,那么就不可能满足所有人的需求,目标序列就崩了
由于目标序列和原序列都是固定的,那么我们可以从1号同学开始,使两边满足1的需求,然后满足a两边同学的需求,最后扩展出整个目标序列,由于序列在实际上是一个环,所以从1开始时,左右是可以不分的,也就是需求两边的人在左还是在右是无所谓的
然后我们感性理解下题意会发现佳佳的命令其实可以看做将整个序列进行冒泡排序,
这时,我们就可以选择直接模拟冒泡排序,统计步数,步数就是代价。
当然50000的数据,可能需要一些优化才能过,
那么O(n)O(n)O(n)的求法就是把目标圈和原序列圈转
办法就是,用一个数组,来存每个点到它应该在的位置的距离,当几个点距离相同时,这几个点就可以一起到目标位置。所以我们可以求出最多有几个点相同距离,最终答案就是总数-相同人数。
注意的是:判断距离时依然要分两组,顺时针和逆时针都要判断一下。
方法:顺时针时,期望圈数组中第i个人,初始时应该在b[i],所以距离为(i-b[i]),为了使距离都在0~n-1之间,写为(i-b[i]+n)%n;
逆时针时,期望圈数组中第i个人,初始时应该在(n-b[i]+1)的位置【这里其实是让n作为初始圈第1个位置】同理,写为(n-b[i]+1+n)%n;

代码:

#include<bits/stdc++.h>#define MAXN 500010using namespace std;int a[MAXN], b[MAXN];
int wt[MAXN][3], h[MAXN];
int n;int ans = -1;int main()
{scanf("%d", &n);for(int i = 1; i <= n; ++i){scanf("%d%d", &wt[i][1], &wt[i][2]);}// for(int i = 1; i <= n; ++i){//      printf("%d %d\n", wt[i][1], wt[i][2]);
//  }h[1] = 1, h[n] = wt[1][2], h[2] = wt[1][2];for(int i = 3; i <= n; ++i){if(wt[h[i - 1]][1] == h[i - 2]) h[i] = wt[h[i - 1]][2];else h[i] = wt[h[i - 1]][1];}//    for(int i = 1; i <= n; ++i){//      printf("%d ", h[i]);
//  }
//  puts("");int r, l;for(int i = 1 ; i <= n; ++i){r = i - 1, l = i + 1;if(r < 1) r = n;if(l > n) l = 1;if((h[r] != wt[h[i]][1] || h[l] != wt[h[i]][2]) && (h[l] != wt[h[i]][1] || h[r] != wt[h[i]][2])){puts("-1");return 0;}}for(int i = 1; i <= n; ++i){++a[(h[i] - i + n) % n];++b[(h[i] + i - 1) % n];}for(int i = 0 ; i < n; ++i){ans = max(ans, max(a[i], b[i]));}printf("%d\n", n - ans);return 0;
}

参考题解

洛谷题解“zzzyc”的题解
洛谷题解“北方有小仙儿”的题解

[noip2005]篝火晚会相关推荐

  1. noip2005篝火晚会 2008.10.18

    noip2005篝火晚会 2008.10.18 注意: 1.       刚开始,我用的是图来标记这两个人是否已经输出过,一直出错,后来看了标称,方法很好 2.       求出序列后,因为是圆环,要 ...

  2. [原创][NOIP2005]篝火晚会(超详细题解,3种思路)

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

  3. NOIP2005 篝火晚会 解题报告

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

  4. Luogu1053 NOIP2005篝火晚会

    首先造出所要求的得到的环.如果将位置一一对应上,答案就是不在所要求位置的人数.因为显然这是个下界,并且脑补一下能构造出方案达到这个下界. 剩下的问题是找到一种对应方案使错位数最少.可以暴力旋转这个环, ...

  5. noip2005篝火晚会

    这是一道不算太难的题,但愚蠢的我并没有想到. 首先,判断无解的情况:他想相邻的不想与他相邻. 然后,构造出合法的数列,因为第一位左边有两种选择,且构造出的环不等价,所以要做两次. (这一点我并没有想清 ...

  6. 【NOIP2005 提高组】篝火晚会

    题目 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官& ...

  7. 五一惠州双月湾游,海滩,帐篷,野营,烧烤、篝火晚会

    惠州沙滩周末两日一晚游 活动介绍 线路特色 行程安排 费用说明 粉丝优惠价 注意事项 客服专线 报名入口 路上干点啥呢 惠州双月湾帐篷露营.烧烤BBQ.篝火晚会狂欢.出海捕鱼二日游 为公司企业团体策划 ...

  8. NOIP 2005 篝火晚会

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

  9. P1053 篝火晚会

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

最新文章

  1. alert(1) to win 16
  2. Java中BigDecimal的一个除法异常
  3. 【转载】一起聊天的wz132
  4. html5简单提问,【问答技巧】怎样提问才能让我的问题更快速被解答?
  5. 一文理解 pytorch 拟合网络的过程
  6. serve注解是加在哪个类_PHP 8新特性之Attributes(注解)
  7. 设计c语言程序,输出形状为直角三角形的九九乘法表,c语言题库(全国c语言二级考试题库)...
  8. VTN:视频Transformer网络
  9. IOS7.1.2越狱手工美化(字体,状态栏等资源) CSDN
  10. Ant下载安装配置及使用
  11. python中除法带小数点_python 除法保留两位小数点的方法
  12. 磊科路由器dns服务器老要修复,路由器DNS劫持的解决方法
  13. 涵盖多场景区块链与政务结合 应用前景广阔
  14. Unity 实战项目 ☀️| Unity实现 天空盒 轮播系列切换
  15. 如何快速读懂开源代码?
  16. 笔记:MySQL中的DDL、DML、DQL、约束等知识以及Navicat的安装教程
  17. PHP 递归和递推思想
  18. [Linux学习笔记] 浅谈信号(文章含不少学习资源)
  19. 基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
  20. 影视级调色lut预设包 Triune Color Cinematic LUTs V2

热门文章

  1. excel表格怎么调整行高和列宽_同事看呆!文档怎么打印在一页上?这招超简单!...
  2. 水星pppoe连接服务器无响应,利用水星路由器系统日志解决PPPOE拨号故障
  3. 蒙特卡洛模拟与matlab,用MATLAB进行蒙特卡洛模拟?
  4. Oracle数据库学习(六):where条件查询及关键字使用
  5. html 内嵌iframe,html页面 内嵌iframe
  6. python写文件字母_Python - 文件读写
  7. 傻孩子菜单框架(转)
  8. js获取元素下的第一级子元素
  9. python_循环语句for_1.12
  10. 计步器锁屏后依然工作的原理