• 入门OJ 1256【排队】


    描述

    小Q是班长。在校运动会上,小Q班要进行队列表演。小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1的同学中间恰好夹1名同学,两个编号为2的同学中间恰好夹2名同学,……,两个编号为N的同学中间恰好夹N名同学,小Q希望知道这样的排法能否实现。

    输入输出格式

    输入

    输入文件仅包括一行,即要处理的N。N<=13

    输出

    输出有多少种排列顺序.

    输入输出样例

    输入样例1

    3

    输出样例1

    2
    

    解题思路

      咳咳,首先,这道题就是典型的DFS,只能搜索,然而我们每次的编号都是两个人中靠前的人,比较方便。然后这道题有两个注意的地方

        1.搜索时要控制上限,我们从一开始枚举位置,一直到2*n太浪费时间,所以我们要用2*n-编号-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)=(1+2N)*2N/2

          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时,问题无解

    题解

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,ans;
     4 bool mp[101];//队列 
     5 void dfs(int dep)
     6 {
     7     if(dep==0)//搜索完了方案数+1 
     8     {
     9         ans++;
    10         return;
    11     }
    12     for(int i=1;i<2*n-dep;i++)//控制上限 
    13     {
    14         if(!mp[i]&&!mp[i+dep+1])//如果这个点没被放并且它对应的点也没放 
    15         {
    16             mp[i]=mp[i+dep+1]=true;//我们就放它 
    17             dfs(dep-1);//继续搜索 
    18             mp[i]=mp[i+dep+1]=false;//回溯操作 
    19         }
    20     }
    21 }
    22 int main()
    23 {
    24     cin>>n;
    25     if(n%4==1||n%4==2)//无解情况 
    26     {
    27         cout<<0;
    28         return 0;
    29     }
    30     dfs(n);//从编号大的开始搜索 
    31     cout<<ans;//输出方案数 
    32 }
  • 相关阅读:
    Intellij使用心得(四) -- 导入Eclipse的代码格式化文件
    idea安装插件plugin(主要针对网络连接不上的情况)
    IDEA破解方法以及快捷键大全
    eclipse+maven搭建自己web系统的骨架,解决自带骨架加载无限慢的问题
    用Eclipse创建Maven多模块项目
    Maven实战--- dependencies与dependencyManagement的区别
    redis之有序集合类型(Zset)——排行榜的实现
    做一个完整的Java Web项目需要掌握的技能
    经典面试题:用户反映你开发的网站访问很慢可能会是什么原因
    linux 免密码 使用sudo 直接使用root权限执行命令
  • 原文地址:https://www.cnblogs.com/hualian/p/11183145.html
Copyright © 2020-2023  润新知