【题解】间隔排列-C++
题目
Description
小Q是班长。在校运动会上,小Q班要进行队列表演。小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1的同学中间恰好夹1名同学,两个编号为2的同学中间恰好夹2名同学,……,两个编号为N的同学中间恰好夹N名同学,小Q希望知道这样的排法能否实现。
Input
输入文件仅包括一行,即要处理的N。N<=13
Output
输出有多少种排列顺序.
Sample Input
3
Sample Output
2
思路
这道题依然是DFS,每次搜索第dep个人放的位置,列举的范围从1到2n-dep-1,因为如果到2n-dep-1之后的位置,带有dep数字的两个人中间是无法隔dep个人的(前面都放了),所以就这样搜索下去。
当程序写完试运行时,我们发现N mod 4=1或2时,发现运行的时间较长,而其它情况下程序很快就找到可行解,我们就应该警觉到N mod4=1或2时,不存在可行解,下面我们证明N mod 4=1或2时,问题无解。
设问题的一个可行解为a1,a2,……,an,其中ai为标号为i的数字的位置,
这些数字它们对应数字的位置应该为a1+1+1,a2+2+1,……,an+n+1.这2N个整数a1,a2,……,an, a1+1+1,a2+2+1,……,an+n+1正是整数1,2,3,……,2N,因而
a1+a2+…+an+(a1+1+1)+(a2+2+1)+…+(an+n+1)
=
2(a1+a2+an)+n(n+1)/2+n=2n(2n+1)/2
2(a1+a2+…+an)=(3n2-n)/2
4(a1+a2+…+an)=n(3n-1)
可见n(3n-1)应该为4的倍数(上一排的等式推出),当n mod 4=0,1,2,3时,n(3n-1) mod 4分别为0,2,2,0,故n mod 4=1或2时,不满足设的“有解”的前提,问题无解
代码如下
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
bool flag[];
void ord(int per,int pla)
{
flag[pla]=!flag[pla];
flag[pla++per]=!flag[pla++per];
return;
}
void dfs(int dep)
{
if(dep>n)
{
cnt++;
return;
}
for(int i=;i<=*n-dep-;i++)
{
if(!flag[i]&&!flag[i+dep+])
{
ord(dep,i);
dfs(dep+);
ord(dep,i);
}
}
}
int main()
{
cin>>n;
if(n%==||n%==)
{
cout<<<<endl;
return ;
}
dfs();
cout<<cnt<<endl;
return ;
}
【题解】间隔排列-C++的更多相关文章
- [DFS]排队(间隔排列)-C++
Description 小Q是班长.在校运动会上,小Q班要进行队列表演.小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1 ...
- [题解](排列/逆序对)luogu_P1338末日的传说
首先我们要考虑怎么排能使逆序对数最多:显然是下降序列时,会产生n*(n-1)/2数量的逆序对 那么我们肯定是要尽量把序列的尾端安排成下降序列,前面的尽量不动,中间可能有一段排列自适应到m的逆序对数 然 ...
- [题解](排列组合)luogu_P3223排队
把老师和女生插到男生中间,先对男生排列:A(n,n),然后把老师插到n+1个空里:A(n+1,2),然后放入女生:A(n+3,m) 但是少考虑了老师之间由1个女生分开的情况,所以把三个人看作一个整体, ...
- Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合
C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...
- 【数论·错位排列】bzoj4517 排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 1428 Solved: 872[Submit][Statu ...
- IOS开发基础知识--碎片50
1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...
- Masonry介绍与使用实践:快速上手Autolayout
1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 w ...
- Storm入门3-集群搭建
[storm集群的搭建以及将开发好的拓扑提交到集群上运行的方法] 在上一篇文章中,我们的拓扑直接运行,并在程序开始时候自动启动一个本地"集群"来运行拓扑.LocalCluster这 ...
- Coding源码学习第四部分(Masonry介绍与使用(三))
接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...
随机推荐
- Spring Boot系列教程十一: Mybatis使用分页插件PageHelper
一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...
- [NOIP普及组2001]最大公约数和最小公倍数问题
目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 数据 样例 输入 输出 说明 题目名称:最大公约数和最小公倍数问题 来源:2001年NOIP普及组 链接 博客链接 CSDN 洛谷 ...
- GPIO输入—按键检测(开关控制小灯)
本次的代码全是在上次代码之上添加的. 1.user下新建文件夹key,新建bsp_key.h bsp_key.c文件. 2.keil项目添加bsp_key.c,魔术棒C/C++中include pat ...
- linux 安装xdebug
一.安装了 xdebug php -m | grep 'xdebug' 如果没有安装就执行 首先根据 phpinfo() 信息 下载对应的版本,具体看参数: 下载地址:https://xdebug.o ...
- delete删除数据造成归档日志增加,操作系统空间不足导致数据库hang住
业务需求,对日志表历史数据进行清理.历史表均很大,使用delete 操作删除90天前的数据. 第一部分:快速删除数据 SQL> alter table CC.F_LOG parallel ; S ...
- (一)Centos之VMware虚拟机安装
一.下载 64位的VM12 安装包: http://pan.baidu.com/s/1bpzoXQZ 二.安装 点击下一步: 老规矩,打勾,下一步: 这里我们新建一个文件夹 VM12 最好放在D盘或者 ...
- (二)发布第一个WebService服务与DSWL文档解析
1. 编写接口 package service; import javax.jws.WebService; /** * 第一个webservice服务, * @WebService注解表示这是一个we ...
- powerdesign中逆向工程后name和comment的互换
powerdesign 中,将数据库中可以逆向生成pdm的结构图,比较清晰看到系统的结构, 但假如是db先行的话,一般是db中的每个列中用comment中文注释说明这列是 干什么的,但逆向工程后,会发 ...
- javascript的装载和执行
前言 为什么要采用js来create一个script标签,设置src然后append到head中,而不是直接使用script标签,这样不是更简单点吗? javascript的装载和执行 首先,我想说一 ...
- ElementUI 复杂顶部和左侧导航栏实现
描述:如图 项目路径如下图所示: 代码实现: 首先在store.js中添加两个状态: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vue ...