【置换群/模拟】NOIP2005-篝火晚会
【问题描述】
佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有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。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?
【输入文件】
输入文件fire.in的第一行是一个整数n(3 <= n <= 50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。
【输出文件】
输出文件fire.out包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。
【样例输入】
4
3 4
4 3
1 2
1 2
【样例输出】
2
【数据规模】
对于30%的数据,n <= 1000;
对于全部的数据,n <= 50000。
【思路】
假设起始状态为1...n。首先以第一个孩子为起点,模拟实现一个环的目标状态。此时如果建环过程中出现矛盾,直接输出-1;否则,一定可以通过若干次操作移动到目标状态。
由于是环,起点位置可以改变,而且可以正序倒序两种方式。有以下几个结论:
(1)两个数,如果它们和起始状态的差加上n再mod n的结果一样,说明它们共同移动某步,能移动到目标状态。看下面这个例子:
起始状态:1 2 3 4 5
目标状态:1 5 3 2 4
差值: 0 3 0 -2 -1
我们可以发现,对于5和2,(3%5=3),((-2+5)%5=3)相等。而这两个数向右移动两位,都可以到达目标状态。
(2)每次移动一个价值,一定能使得一个数到达自己的目标状态。也就是说,有几个数与目标状态不对应,就需要消耗多少价值。
由此我们可以明白:
把差值(加n %n后)相同个数的最大值max求出来,然后把这几个数假设就在目标状态,那么移动需要的价值为n-max。因为环可以正反,正反各来一次即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN= +;
int n;
int want[MAXN][];
int q[MAXN]; void init()
{
scanf("%d",&n);
for (int i=;i<n;i++)
{
scanf("%d%d",&want[i][],&want[i][]);
want[i][]--;
want[i][]--;
}
} int canmake()
{
q[]=;
q[]=want[][];
for (int i=;i<n-;i++)
{
if (q[i-]!=want[q[i]][]) q[i+]=want[q[i]][];
else if (q[i-]!=want[q[i]][]) q[i+]=want[q[i]][];
else return ;
}
if (want[q[n-]][]!= && want[q[n-]][]!=) return ;
for (int i=;i<n;i++) cout<<q[i]<<endl;
return ;
} void submain()
{
int ans=;
int appear[MAXN];
int appear2[MAXN];
memset(appear,,sizeof(appear));
memset(appear2,,sizeof(appear2));
for (int i=;i<n;i++)
{
appear[(q[i]-i+n)%n]++;
appear2[(q[i]+i-)%n]++;
if (appear[(q[i]-i+n)%n]>ans) ans=appear[(q[i]-i+n)%n];
if (appear2[(q[i]+i-)%n]>ans) ans=appear2[(q[i]+i-)%n];
}
cout<<n-ans<<endl;
} int main()
{
//freopen("fire9.in","r",stdin);
//freopen("fire9.out","w",stdout);
init();
if (canmake()) submain();
else cout<<-<<endl;
system("pause");
return ;
}
【置换群/模拟】NOIP2005-篝火晚会的更多相关文章
- [LuoguP1053][Noip2005]篝火晚会
[LuoguP1053][Noip2005]篝火晚会(Link) 现在你有一个排成一个圈的\(N\)大小的队列,一开始的顺序是\(\{1,2,3,4...N\}\),一共有\(N\)个要求,第\(i\ ...
- NOIP2005 篝火晚会 解题报告
佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照1,2,… ...
- NOIP2005 篝火晚会
篝火晚会 (fire.pas/c/cpp) [问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会. ...
- Luogu1053 NOIP2005篝火晚会
首先造出所要求的得到的环.如果将位置一一对应上,答案就是不在所要求位置的人数.因为显然这是个下界,并且脑补一下能构造出方案达到这个下界. 剩下的问题是找到一种对应方案使错位数最少.可以暴力旋转这个环, ...
- noip2005篝火晚会
这是一道不算太难的题,但愚蠢的我并没有想到. 首先,判断无解的情况:他想相邻的不想与他相邻. 然后,构造出合法的数列,因为第一位左边有两种选择,且构造出的环不等价,所以要做两次. (这一点我并没有想清 ...
- 「NOIP2005」「Codevs1106」篝火晚会
题目描述 Description 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1 ...
- [NOIP2005] 提高组 洛谷P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...
- 洛谷 P1053 篝火晚会 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- [NOIP 2005]-- 篝火晚会
额~~,对这组题感兴趣的具体的解题报告可以戳戳这里:http://wenku.baidu.com/view/878beb64783e0912a2162aa7.html?qq-pf-to=pcqq.c2 ...
随机推荐
- base--AuditResult
//参考base-4.0.2.jar public class AuditResult implements TimeReferable, Serializable //参考api-1.0.0.jar ...
- [Leetcode Week17]Copy List with Random Pointer
Copy List with Random Pointer 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/copy-list-with-random- ...
- android CVE 漏洞汇总
arm exploits 技术教程: Learning Pentesting for Android Devices CVE-2015-1530 ,CVE-2015-1474 两个android整数溢 ...
- Laravel 项目上线的一些注意事项
1.应用生产环境 在 .env 文件里设置 APP_ENV=production 2.关闭调试模式 在 .env 文件中设置 APP_DEBUG = false 3.生成 APP_KEY 使用 Art ...
- Laravel 调试器 Debugbar 和数据库导出利器 DbExporter 扩展安装及注意事项
一.Debugbar安装 参考:Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程 的“2.安装”部分 二.DbExporter安装 参考:Laravel 扩展推荐 ...
- Django 国内最全教程
https://code.ziqiangxuetang.com/django/django-tutorial.html
- 【模板】BZOJ 3781: 小B的询问 莫队算法
http://www.lydsy.com/JudgeOnline/problem.php?id=3781 N个数的序列,每次询问区间中每种数字出现次数的平方和,可以离线. 丢模板: #include ...
- hadoop 安装 错误及解决方法
1.ssh 相关问题: rm ~/.ssh/known_hosts //与ssh中的不服 //再重新生成密钥 2.ERROR namenode.NameNode: java.io.IOExceptio ...
- DevExpress.XtraTreeList 小结
搞了半天才绑定好,没有弄清楚父子之间的关系 <dx:ASPxTreeList ID="ASPxTreeList1" runat="server" Auto ...
- Leetcode 之Binary Tree Postorder Traversal(46)
采用广度优先遍历,一个变量记录层数,一个变量记录方向. void traverse(TreeNode *root, vector<vector<int>> result, in ...