P1053 篝火晚会

题目描述

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

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

(b1, b2,... bm -1, bm)

这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1,b2,…… bm的这m个同学的位置。要求b1换到b2的位置上,b2换到b3的位置上,……,要求bm换到b1的位置上。执行每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

4

3 4

4 3

1 2

1 2
输出样例#1:

2

说明

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

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

2005提高组第三题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define maxn 50010
using namespace std;
map<string,bool>vis;
map<string,bool>ok;
int n,a[maxn],b[maxn],ans=0x7fffffff;
void dfs(string now,int sum){
if(sum>=ans)return;
if(sum>n)return;
if(ok[now]){
ans=min(ans,sum);
return;
}
string to="";
for(int len=;len<=n;len++){
for(int l=;l<=n-len;l++){
int r=l+len-;
to="";
to=to+now.substr(,l);
to=to+now[r];
to=to+now.substr(l,len-);
to=to+now.substr(r+,n-r);
if(vis[to])continue;
dfs(to,sum+len);
}
}
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
string s="";
//char ch=a[1]+'0';
s=s+'';
s=s+(char)(a[]+'');
for(int i=;i<n;i++){
int now=s[i-]-'';
if(s[i-]==(char)(a[now]+''))s=s+(char)(b[now]+'');
if(s[i-]==(char)(b[now]+'')) s=s+(char)(a[now]+'');
}
bool flag=;
if(s.length()!=n)flag=;
ok[s]=;
string ss="";
for(int i=;i<n;i++){
ss=ss+s[n-];
ss=ss+s.substr(,);
ok[ss]=;
s=ss;ss="";
}
s="";
s=s+(char)(b[]+'');
for(int i=;i<n;i++){
int now=s[i-]-'';
if(s[i-]==(char)(a[now]+''))s=s+(char)(b[now]+'');
if(s[i-]==(char)(b[now]+'')) s=s+(char)(a[now]+'');
}
if(s.length()==n)flag=;
ok[s]=;
ss="";
for(int i=;i<n;i++){
ss=ss+s[n-];
ss=ss+s.substr(,);
ok[ss]=;
s=ss;ss="";
}
if(flag){
puts("-1");
return ;
}
string s1="";
for(int i=;i<=n;i++)s1=s1+(char)(i+'');
vis[s1]=;
dfs(s1,);
printf("%d",ans);
}

10分 暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#define maxn 50010
using namespace std;
int n,a[maxn],b[maxn],p[maxn],k,f[maxn],s,ans,l;
bool vis[maxn];
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
k=;l=;
for(int i=b[];i!=&&vis[i]==;){
p[++k]=l;vis[i]=;
if(a[i]==l){l=i;i=b[i];}
else{l=i;i=a[i];}
}
p[++k]=l;
if(k!=n){
puts("-1");return ;
}
memset(f,,sizeof(f));
for(int i=;i<=n;i++){
if(p[i]>=i)f[p[i]-i]++;
else f[p[i]+n-i]++;
}
for(int i=;i<n;i++)ans=max(ans,f[i]); k=;l=;
for(int i=a[];i!=;){
p[++k]=l;
if(a[i]==l){l=i;i=b[i];}
else{l=i;i=a[i];}
}
p[++k]=l;
memset(f,,sizeof(f));
for(int i=;i<=n;i++){
if(p[i]>=i)f[p[i]-i]++;
else f[p[i]+n-i]++;
}
for(int i=;i<n;i++)ans=max(ans,f[i]);
printf("%d",n-ans);
}

100分

洛谷P1053 篝火晚会的更多相关文章

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

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

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

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

  3. 洛谷 P1053 篝火晚会

    https://www.luogu.org/problemnew/show/P1053 错误记录:判-1的时候出了些问题(比如只判了图是否连通):数组没清空 #include<cstdio> ...

  4. 洛谷 P1053 解题报告

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

  5. [luogu]P1053 篝火晚会[数学][群论]

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

  6. P1053 篝火晚会

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

  7. LUOGU P1053 篝火晚会 (Noip 2015 )

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

  8. 洛谷 P1053 音乐会的等待 解题报告

    P1823 音乐会的等待 题目描述 \(N\)个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人\(A\)和\(B\),如果他们是相邻或他们之 ...

  9. luogu P1053 篝火晚会

    传送门 首先如果题目的目标状态不是一个环就不合法 然后先把这个环搞出来,然后每个位置上的数对这个数对应的位置连边,可以发现有若干个环,而只要对这些环执行操作就好了,答案上界显然是\(n\).然后,如果 ...

随机推荐

  1. Python基础-os、sys模块

    一,os模块import os ,sysos.system('ipconfig')#执行操作系统命令,获取不到返回结果 os.popen()#也可以执行操作系统命令,可以返回命令执行结果,但需要rea ...

  2. OpenCV——旋转模糊 (二)

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  3. cocos2d-x 中 xml 文件读取

    实现类 CXmlParse 啥也不说了  直接上硬货  believe yourself   一看就明白 CXmlParse.h #ifndef __C_XML_PARSE__ #define __C ...

  4. 【二叉树的递归】03判断二叉树中有没有和为给定值的路径【Path Sum】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树和一个和,判断这个树 ...

  5. git克隆某一个branch

    git clone -b <branch> <remote_repo> 例如: git clone -b 指定的分支名字

  6. FFMPEG 最简滤镜filter使用实例(实现视频缩放,裁剪,水印等)

    FFMPEG官网给出了FFMPEG 滤镜使用的实例,它是将视频中的像素点替换成字符,然后从终端输出.我在该实例的基础上稍微的做了修改,使它能够保存滤镜处理过后的文件.在上代码之前先明白几个概念: Fi ...

  7. 汇编题目:在屏幕中间显示a-z的所有字母,按ESC键改变字符颜色

    在屏幕中显示a-z字母,按ESC键改变字符颜色. ;程序功能:在屏幕中间同一点显示a-z的所有字符 ; 1.使用cpu循环空运行实现延迟 ; 2.按ESC键改变正在循环显示的字符的颜色 ; 3.程序完 ...

  8. UML Design Via Visual Studio-Class Diagram

    用过几个建模设计工具,小的有staruml,大的有rational rose,EA.最后发现还是Visual Studio建模比较舒服(个人观点,不要争论). 打算对自己经常用的几个建模图做一个介绍, ...

  9. Python:模块详解及import本质

    转于:http://www.cnblogs.com/itfat/p/7481972.html 博主:东大网管 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), ...

  10. Nginx正则表达式之匹配操作符详解

    nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewrite.盗链.对静态资源设置缓存以及浏览器限制等等.由于nginx配置中有if指令,但是没有对应else指令,所以 ...