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. 分享知识-快乐自己:shiro 异常类型

    <!-- 身份认证异常 --> 1):身份令牌异常,不支持的身份令牌 --> org.apache.shiro.authc.pam.UnsupportedTokenException ...

  2. C# 往excel出力数据

    /// <summary> /// 出力Excel /// </summary> /// <param name="storeModelForExcel&quo ...

  3. C趣味题目

    http://www.cnblogs.com/lua5/archive/2010/12/05/1896755.html   c语言趣味题目 http://www.cppblog.com/OnTheWa ...

  4. Python基础-os、sys模块

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

  5. 第二章 python基础(二)

    第九节 函数 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字. 可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句. ...

  6. BEC listen and translation exercise 41

    Its advantages are that it can be used for outside activities So my recommendation I'm afraid would ...

  7. codeforces 652B B. z-sort(水题)

    题目链接: B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. hdu-5646 DZY Loves Partition(贪心)

    题目链接: DZY Loves Partition Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 262144/262144 K ( ...

  9. uva1160 易爆物

    #include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>using ...

  10. 2017-2018-1 20179215《Linux内核原理与分析》第九周作业

    实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 一.实验要求  (1)理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判 ...