一、题目描述

有n个人首先站成一排,请问,当n个人第二次再重新排列,每个人都不在原来的位置上,问有多少种站法。例如,原来有3个人,ABC,那么第二次每个人都不在原来的位置上有2种站法,BCA和CAB,这题其实是一道数学题,考察排列组合的知识。

解题思路:假设有n个人,我们的问题规模设为A(n),A(n)代表n个人都不在原来的位置上一共有多少种站法。令第1个人站在非1号位置,一共有n-1种站法,假设第1个人站在2号位置,那么第2个人的站的位置分2类:第一类是第2个人站在1号位置,这样第1个人和第2个人的位置都确定了,那么剩下n-2个位置,问题规模变成了A(n-2),相当于第3个人不站在3号位置,第4个人不站在4号位置.....第n个人不站在n号位置,第二类是第2个人不是站在1号位置,那么问题的规模又变成了A(n-1),相当于第2个人不站在1号位置,第3个人不站在3号位置,第4个人不站在4号位置......第n个人不站在n号位置。所以A(n) = (n-1) * ( A(n-1) + A(n-2) ),这样解题的思路就清晰了,只需要定义一个数组arr[n + 1],首先保存arr[1] = 0,arr[2] = 1,从arr[3]开始,迭代计算 arr[i] = (i - 1) * (arr[i - 1]  + arr[i - 2]),最后返回arr[n]就行了,也可以定义三个变量分别保存arr[1],arr[2],arr[3],然后交替赋值,这样能节省空间。为了清晰,我还是以定义数组来演示程序。

二、代码演示

/**
* n个人原来站成一排,重新再排一次,要求每个人都不能
* 站在原来的位置,求有多少种站法。
* @param n
*/
public static int fun(int n) {
if(n <= 1) return 0;
if(n == 2) return 1;
int[] arr = new int[n + 1];
arr[1] = 0;
arr[2] = 1;
for(int i = 3; i <= n; i++) {
arr[i] = (i - 1) * (arr[i - 1] + arr[i - 2]);
}
return arr[n];
}

n个人排队都不站在原来的位置的更多相关文章

  1. context.getResourceAsStream获取的是部署在服务器上面的文件位置 而不是我们本地的工程位置 意思是说获取的都是web下面的文件位置

    context.getResourceAsStream获取的是部署在服务器上面的文件位置 而不是我们本地的工程位置 意思是说获取的都是web下面的文件位置

  2. POJ 2828 Buy Tickets(排队问题,线段树应用)

    POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意:  排队买票时候插队.  给出一些数对,分别代表某个人的想要插入的位 ...

  3. POJ 2828Buy Tickets(线段树的单点维护)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 20462   Accepted: 10096 Des ...

  4. poj-2828 Buy Tickets(线段树,排队问题,逆向思维)

    题目地址:POJ 2828 Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Yea ...

  5. hdu 1465 不容易系列之一(错排模板)

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  6. AlloyTeam2015前端大会都说了啥

    昨天在腾讯大厦参与了鹅厂AlloyTeam召开的AC2015前端大会,度过了充满精彩和收获的一个下午,用一句话形容这次前端Event应该是“诚意满满,干货满满”. 说实话,这次AlloyTeam没有对 ...

  7. Lucene.net站内搜索—1、SEO优化

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  8. XSS跨站及利用

    (一)软件测试环境以及搭建 测试环境:本地 XAMPP 1.7.1 测试软件:PHP168整站v5.0 软件下载地址 http://down2.php168.com/v2008.rar PHP.ini ...

  9. 跨站的艺术-XSS Fuzzing 的技巧

    作者 | 张祖优(Fooying)  腾讯云 云鼎实验室 对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做Fuzzing:同样是Fuzzing, ...

随机推荐

  1. androidStudio修改包名 Android 如何修改包名(同一个手机可以跑2个eros 项目)。

    修改applicationId(gradle.properties). 2.即时同步更新过去,否则不报错

  2. 私有npm下载资源

    私有npm库下载资源需要用户名和密码,这个需要创建npm库的人提供. 使用方法: npm login --registry=仓库地址 Username: 用户名 Password: 密码 Email: ...

  3. WPF中的拖放1

    实现了WPF的不同层级间的元素之间的拖放,例子虽小却很经典,引申一下也许可以实现类VS界面的浮动依靠面板. 拖放前: 拖放后: 代码如下: <Window x:Class="WpfAp ...

  4. 配置Ubuntu DNS

    首先,你可以在/etc/hosts中加入一些主机名称和这些主机名称对应的IP地址,这是简单使用本机的静态查询.要访问Ubuntu DNS 服务器来进行查询,需要设置/etc/resolv.conf文件 ...

  5. Hibernate数据库的操作

    参考网址: https://www.cnblogs.com/jack1995/p/6952704.html 1.最简单的查询 List<Special> specials = (List& ...

  6. /opt/metasploit/msf3

    启动msf终端 cd  /opt/metasploit/msf3 msfconsole

  7. python3基础08(exec、bytearray使用等)

    #!/usr/bin/env python# -*- coding:utf-8 -*- str="test"print(ascii(str))a=bytearray("a ...

  8. safenet 超级狗 加密狗

    1.CS程序可以工作正常: 2.BS程序,服务器验证狗,IIS设置32位兼容方法1: dog.SetLibPath,设置查找依赖dll路径: 方法2:默认系统目录 C:\Windows\SysWOW6 ...

  9. v-if与v-show的区别

    一.区别 v-if 动态的向DOM树内添加或者删除DOM元素:“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:在初始渲染条件为假时,什么也不做. v-sho ...

  10. ubuntu下JDK安装(更新旧版本JAVA)

    1.sudo apt-get install openjdk-8-jre openjdk-8-jdk 2.默认会安装在 路径为 /usr/lib/jvm/java-7-openjdk-amd64 下面 ...