洛谷P1053 篝火晚会
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。
输入输出样例
4 3 4 4 3 1 2 1 2
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 篝火晚会的更多相关文章
- 洛谷 P1053 篝火晚会 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- [NOIP2005] 提高组 洛谷P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...
- 洛谷 P1053 篝火晚会
https://www.luogu.org/problemnew/show/P1053 错误记录:判-1的时候出了些问题(比如只判了图是否连通):数组没清空 #include<cstdio> ...
- 洛谷 P1053 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- [luogu]P1053 篝火晚会[数学][群论]
[luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...
- P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有nnn个同学,编号从111到nnn.一开始 ...
- LUOGU P1053 篝火晚会 (Noip 2015 )
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 nnn 个同学,编号 ...
- 洛谷 P1053 音乐会的等待 解题报告
P1823 音乐会的等待 题目描述 \(N\)个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人\(A\)和\(B\),如果他们是相邻或他们之 ...
- luogu P1053 篝火晚会
传送门 首先如果题目的目标状态不是一个环就不合法 然后先把这个环搞出来,然后每个位置上的数对这个数对应的位置连边,可以发现有若干个环,而只要对这些环执行操作就好了,答案上界显然是\(n\).然后,如果 ...
随机推荐
- Selenium-使用firepath识别元素
利用firepath进行元素识别提前已经安装好firebug和firepath 比如,打开http://www.baidu.com 1.按下F12 2.点击如图的位置 3.选择元素,可以定位出元素的属 ...
- Eclipse_常用技巧_03_字母大小写转换快捷键
eclipse中字母大小写转换快捷键: ctrl+shift+x 转为大写 ctrl+shift+y 转为小写
- stl_pair.h
stl_pair.h // Filename: stl_pair.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...
- vc中播放mp3文件的方法小结
一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1. 使用mci #include <windows.h> ...
- 解决苹果手机Safari浏览器下 字体显示为 蓝色的 问题
解决苹果手机 Safari浏览器下 字体显示为蓝色的 问题 近期测试同学测试,wap站上,底部文字在苹果8上面 ,使用 Safari浏览器打开,一直显示 蓝色字体 其他正常,寻找半天无解,最后 阳 ...
- Java中的String数据类型
本文主要是说明一些String数据类型的基本知识,有些杂乱,不过都是比较重要的东西,主要是参考了网上人的资料.原文网址:http://dev.yesky.com/91/2309091.shtml 主要 ...
- UVA624(01背包记录路径)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- JVM体系结构之一:总体介绍
一.Java的内存区域划分 Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这一节我们就来解析一下Java的内存区域. Java的内存区域主要分为五部分: 程序计数器(PC) ...
- 一 Akka学习 - actor
(引用 http://shiyanjun.cn/archives/1168.html) 一: 什么是Akka? Akka是JAVA虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,是一个 ...
- 手把手教你写Kconfig---基于tiny4412开发板
转自:http://blog.csdn.net/morixinguan/article/details/54744237 今天,我就来教大家写写最简单的Kconfig,什么是Kconfig? 我们配置 ...