洛谷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\).然后,如果 ...
随机推荐
- appium-环境搭建(一)
adb命令 adb的全称为Android Debug Bridge,就是起到调试桥的作用.借助adb工具,我们可以管理设备或者手机模拟器的状态.还可以进行很多手机操作,如安装软件\系统升级\运行she ...
- tornado 获取参数
self.get_argument('name') 没有传递name就报400错误了 tornado.web.MissingArgumentError: HTTP 400: Bad Request ( ...
- Arc073_F Many Moves
传送门 题目大意 有$n$个格子从左到右依次挨着,一开始有两枚棋子分布在$A,B$某一个或两个格子里,有$m$个操作,第$i$次操作要求你把其中一个棋子移到$X_i$上,移动一个棋子的代价是两个格子之 ...
- SM234
2017-2018-2 20179212 <网络攻防> 作业 本次实验课由王孟亚.李栋我们三个共同完成,我主要负责SM3的研究和Python实现. SM3的工作原理 SM3密码杂凑算法采用 ...
- ACM学习历程—ZOJ3785 What day is that day?(数论)
Description It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are ...
- bzoj 2794: Cloakroom dp
题目: 有\(n\)件物品,每件物品有三个属性\(a_i,b_i,c_i,(a_i < b_i)\) 再给出\(q\)个询问,每个询问由非负整数\(m,k,s\)组成,问是否能够选出某些物品使得 ...
- Project Online JS 添加Ribbon按钮
var Projects = Projects || {}; (function () { Projects.ribbonButtonClick = function (name) { var pro ...
- 通信端口Com口被占用的原因分析
目前在调试地磅读取程序,近一段时间无法读取,排查原因发现是com1端口被占用. 从网上找了无数个文章,最终得到一条有价值的消息, 原因如下: com1端口不能读取电子地磅的数据了,重启之后发现 有一个 ...
- Struts2 配置项
基础Constants struts.devMode 可选值true,false (默认false),在开发模式下,struts2的动态重新加载配置和资源文件的功能会默认生效.同时开发模式下也会提供 ...
- NumberFormatException: For input string: "null"
日志: [INFO-2016/08/04/16/:21/:25]ProjectCommonFormController.(78) - 审批[同意]入参-[string]commonFormDtoStr ...