题目描述

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有nnn个同学,编号从111到nnn。一开始,同学们按照1,2,…,n1,2,…,n1,2,…,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。

佳佳可向同学们下达命令,每一个命令的形式如下:

(b1,b2,...bm−1,bm)(b_1, b_2,... b_{m-1}, b_m)(b1​,b2​,...bm−1​,bm​)这里mmm的值是由佳佳决定的,每次命令mmm的值都可以不同。这个命令的作用是移动编号是b1,b2,…,bmb_1,b_2,…, b_mb1​,b2​,…,bm​的这mmm个同学的位置。要求b1b_1b1​换到b2b_2b2​的位置上,b2b_2b2​换到b3b_3b3​的位置上,……,要求bmb_mbm​换到b1b_1b1​的位置上。执行每个命令都需要一些代价。我们假定如果一个命令要移动mmm个人的位置,那么这个命令的代价就是mmm。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?

输入格式

第一行是一个整数n(3≤n≤50000)n(3 \le n \le 50000)n(3≤n≤50000),表示一共有nnn个同学。

其后nnn行每行包括222个不同的正整数,以一个空格隔开,分别表示编号是111的同学最希望相邻的两个同学的编号,编号是222的同学最希望相邻的两个同学的编号,……,编号是nnn的同学最希望相邻的两个同学的编号。

输出格式

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

输入输出样例

输入 #1 复制
4
3 4
4 3
1 2
1 2
输出 #1 复制
2

说明/提示

对于30%30\%30%的数据,n≤1000n \le 1000n≤1000;
对于全部的数据,n≤50000n \le 50000n≤50000。

200520052005提高组第三题

思路

首先,为了让总代价最少,一定就要让移动的人次最少,我们方法就是找到一组尽可能多的不用移动的,而剩下的一坨,有可能是一次换的,有可能是两次……但是,无论是多少次,最少的代价一定就是总个数,因为每个人只需要换一次就可以到达他的位置,连成一个环,如果还有其他的环,就再每人换一次,又成一个环,知道换完位置。这样每个人就只需要移动一次就够了。

那么,问题就转换成了求最多可以有多少个人不用动。

所以,我就打了一个模拟,直接从头到尾看看有多少不用动,结果,听取wawawa声一片

额,我再乍一看,一个是初始环,另一个是目标环,要找到最多能有多少一样的,应该要一次一次对过去,然后,有一个方法,就是求出他要移动多少格才可以到达最后的目标点。

这样,移动格数相同的就一定是同一组的,也就是同一次移动的,然后找到最多的一组就可以了。

结果代码一交,又是wawawa

然后又细细一想,啊,目标环还有可能是另一个方向摆的,就是比如说样例,可能是1 3 2 4,也有可能是1 4 2 3,所以就要两次。

结果交上去,终于ACACAC了(太不容易了)

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define maxn 50001
using namespace std;
int n;
int a[maxn],b[maxn];//每个点的两边的点
bool flag[maxn];//判断是否已经用过了
int k[maxn],f[maxn];//目标序列,距离目标点有多少距离
int sum[maxn];//桶计数
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);int now=1;k[1]=1;flag[now]=1;for(int i=2;i<=n;i++){if(!flag[a[now]]){//左边的点还没有用过k[i]=a[now];now=a[now];flag[now]=1;}else if(!flag[b[now]]){//右边的点还没用过k[i]=b[now];now=b[now];flag[now]=1;}else{//两边的点都用过了,判无解printf("-1");return 0;}}for(int i=1;i<=n;i++)f[i]=(i-k[i]+n)%n;//求距离int maxx=0;for(int i=1;i<=n;i++){sum[f[i]]++;//桶计数maxx=max(maxx,sum[f[i]]);//求最大值}//重来一遍memset(sum,0,sizeof(sum));//清空memset(flag,0,sizeof(flag));//清空now=1;k[1]=1;flag[now]=1;for(int i=2;i<=n;i++){if(!flag[b[now]]){//反过来就可以求另一种顺序了k[i]=b[now];now=b[now];flag[now]=1;}else if(!flag[a[now]]){k[i]=a[now];now=a[now];flag[now]=1;}}for(int i=1;i<=n;i++)f[i]=(i-k[i]+n)%n;for(int i=1;i<=n;i++){sum[f[i]]++;maxx=max(maxx,sum[f[i]]);}printf("%d",n-maxx);//注意最后要用来减return 0;
}

谢谢–zhengjun

洛谷P1053篝火晚会题解--zhengjun相关推荐

  1. 洛谷P1053 篝火晚会

    题目 题解: 模拟,构造出整个数列,要求的就是这个数列需要经过多少次操作得到 但是,这其实是一个环,编号为1的可以放任意一个位置,每一位都可以右移一位,最右边的一位移到第一位(后文直接叫右移). 而且 ...

  2. 洛谷P1039侦探推理题解--zhengjun

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  3. 洛谷P1034矩形覆盖题解--zhengjun

    题目描述 在平面上有 nnn 个点(n≤50n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4n=4 时,444 个点的坐标分另为:p1p_1p1​(1,11,11,1),p ...

  4. 洛谷P1036选数题解--zhengjun

    题目描述 已知 nnn 个整数 x1,x2,-,xnx_1,x_2,-,x_nx1​,x2​,-,xn​,以及111 个整数 kkk (k<nk<nk<n).从 nnn 个整数中任选 ...

  5. 洛谷P1033自由落体题解--zhengjun

    题目描述 在高为HHH的天花板上有nnn个小球,体积不计,位置分别为 0,1,2,-,n−10,1,2,-,n-10,1,2,-,n−1.在地面上有一个小车(长为LLL,高为KKK,距原点距离为S1S ...

  6. 洛谷P1070道路游戏题解--zhengjun

    题面传送门 思路 首先,这道题一定是个dpdpdp,因为题中说一旦机器人走到头了,就要立刻在其他任意的一个机器人工厂买. 一开始弄得fi,jf_{i,j}fi,j​是到了第iii个工厂,用了jjj个时 ...

  7. 洛谷P1057传球游戏题解--zhengjun

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的: n n n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传 ...

  8. 洛谷P1018乘积最大题解--zhengjun

    题目描述 今年是国际数学联盟确定的" 200020002000――世界数学年",又恰逢我国著名数学家华罗庚先生诞辰909090周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的 ...

  9. 洛谷P3205 [HNOI2010]合唱队 题解

    洛谷P3205 [HNOI2010]合唱队 题解 题目链接:P3205 [HNOI2010]合唱队 题意: 为了在即将到来的晚会上有更好的演出效果,作为 AAA 合唱队负责人的小 A 需要将合唱队的人 ...

最新文章

  1. leetcode算法题--大礼包
  2. bzoj1816: [Cqoi2010]扑克牌
  3. getHibernateTemplate()和getSession()的区别
  4. 网站新手引导/步骤引导
  5. 你说精通 Redis ,你看过持久化的配置吗?
  6. Qt读取ini文件中文乱码问题
  7. python request 库传送formdata_Python Requests库 form-data 上传文件操作
  8. AngularJS Providers 详解
  9. netstat命令详解Linux,Linux netstat命令详解
  10. matlab数字图像处理课程设计报告,数字图像处理实验报告范文
  11. 解决Android手机人民币符号--¥显示问题
  12. springboot+mybatis报错处理
  13. 最新AZ自动发卡网源码-全网首发
  14. 基于51单片机数码管显示
  15. MoviePy合成视频没有声音
  16. ubuntu 打印git邮箱_win 10配置Ubuntu子系统—可以考虑放弃VMware了
  17. Rosalind Java| Counting Point Mutations
  18. 灵活组合复合图元模板,电路图状态图业务定义可配置,浮云E绘图软件源码开发
  19. [附源码]Python计算机毕业设计SSM流浪猫狗救助站(程序+LW)
  20. windows10进入/退出管理员账户(Administrator)方法

热门文章

  1. POI操作excel基本使用
  2. eclipes 快捷键操作:
  3. Chrome的隐身模式
  4. linux打包解压工具,打包压缩、解压缩工具详解
  5. ValueError.DataFrame columns must be unique for orient=“column“
  6. Vue $once 函数
  7. Banana PI (香蕉派) 安装 ubuntu-core-14 最小核心的操作步骤
  8. Word文档如何设置成不可编辑的模式?
  9. 自控原理学习笔记-反馈控制系统的动态模型(4)-频率特性函数Nyquist图及Bode图
  10. 域名过期了,但是备案信息还是我的,网站被人举报涉黄怎么办?