A1-2017级算法上机第一次练习赛 A The stupid owls

题目描述

Bamboo recently bought an owl for sending and receiving letters. Every owl will bring a letter to exactly one person, so normally Bamboo‘s owl will only bring letters for her.

Although most owls sold in the magical stores are extremely conscientious almost all the time, sometimes they can also make mistakes. For example, on one occasion Bamboo‘s owl brought a letter to her roommate Eve, and Eve‘s owl brought a letter to Bamboo .The two stupid owls made mistakes at the same time!

What‘s worse, if there were n people, each with a stupid owl, so that every one might get a wrong letter . So what the probability of no one getting his or her correct letter?

输入

The input file will contain a list of positive integers n, one per line(0<n<25)。

输出

For each integer n in the input, output the probability(in percentage form) of the n people all receiving a letter that ought to be sent to another one.

Print each output in one line. Please keep two decimals.

输入样例

2

输出样例

50.00%

HINT

错排~

思路

本题是一个典型的错排问题。

关于错排问题,可以参考百度百科:

https://baike.baidu.com/item/%E9%94%99%E6%8E%92%E5%85%AC%E5%BC%8F/10978508?fr=aladdin

以下关于错排公式的推导均摘自百度。

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.

第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;

第二步,放编号为k的元素,这时有两种情况:

⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;

⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;

综上得到:

D(n) = (n-1) [D(n-2) + D(n-1)]

特殊地,D(1) = 0, D(2) = 1.

下面通过这个递推关系推导通项公式:

为方便起见,设D(k) = k! N(k), k = 1, 2, …, n,

则N(1) = 0, N(2) = 1/2.

n ≥ 3时,n! N(n) = (n-1) (n-1)! N(n-1) + (n-1)! N(n-2)

即 nN(n) = (n-1) N(n-1) + N(n-2)

于是有

N(n) - N(n-1) = - [N(n-1) - N(n-2)] / n = (-1/n) [-1/(n-1)] [-1/(n-2)]…(-1/3) [N(2) - N(1)] = (-1)^n / n!.

因此

N(n-1) - N(n-2) = (-1)^(n-1) / (n-1)!,

N(2) - N(1) = (-1)^2 / 2!.

相加,可得

N(n) = (-1)^2/2! + … + (-1)^(n-1) / (n-1)! + (-1)^n/n!

因此

D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]

此即错排公式。

根据错排公式,我们可以写出一个递推函数用来求出d(n),d(n)即所有全排错的事件总数,再除以全部基本事件总数n!即为概率。

注意此题的一个坑点,所有数据都用long long类型。

参考代码

 1 //递归版
 2 #include<stdio.h>
 3 double owl(int n);
 4 int main()
 5 {
 6     int n;
 7     while(scanf("%d",&n) == 1){
 8         double result = owl(n);
 9         printf("%.2f\n",result);
10     }
11 }
12
13 double owl(int n)
14 {
15     if(n == 2)
16         return 1/2;
17     else{
18
19     }
20 }  
 1 //非递归版
 2 #include<stdio.h>
 3 int main()
 4 {
 5     int n,i;
 6     double owl[25];
 7     double temp = 0.5;
 8     owl[2] = 0.5;
 9     for(i = 3;i < 25;i++){
10         temp = temp * (-1) /(i * 1.0);
11         owl[i] = owl[i-1] + temp;
12     }
13     for(i = 2;i < 25;i++)
14         owl[i] = owl[i] * 100;
15     while(scanf("%d",&n) == 1)
16         printf("%.2f%%\n",owl[n]);
17 }  

原文地址:https://www.cnblogs.com/zjsyzmx0527/p/10182478.html

时间: 2024-08-30 16:40:05

A1-2017级算法上机第一次练习赛 A The stupid owls的相关文章

A1-2017级算法上机第一次练习赛 P ModricWang&#39;s Number Theory II

题目描述 ModricWang has found a list containing n numbers. He calls a list bad if and only if it is not empty and gcd (see notes section for more information) of numbers in the list is 1. ModricWang can perform two types of operations: Choose a number an

A1-2017级算法上机第一次练习赛 D 水水的Horner Rule

题目描述 霍纳(Horner)规则是一种将一元n次多项式的求值问题转化为n个一次式的算法.采用最小的乘法运算策略,用于求多项式A(x)=a0+a1x+a2x^2+...+an-1x^n-1+anx^n在x处的值,转化为A(x)=a0+x(a1+x(a2+...+x(an-1+xan)···)).其伪代码如下: y = 0 for i = n downto 0 y = ai + x * y 好的,现在你已经掌握了本题的核心算法! AlvinZH发现,进制之间的转换其实就是霍纳法则的简单应用,如八进

A1-2017级算法上机第一次练习赛 I jhljx学位运算

Problem Description jhljx在C++程序设计课程中学习了位运算这个高端的知识,现在他开始上算法课,决定活学活用.. 位运算中异或是一个比较神奇的操作,有0^1=1,1^0=1,0^0=0,1^1=0. 于是jhljx给你了一个长度为n的数组,让你求出该数组的某个子数组(数组中下标连续的一些元素组成的数组)的异或值之和. Input 输入多组数据.对于每组数据,第一个行为数据组数n(1<=n<=1000000)第二行为n个数组元素(保证元素在int范围内)第三行为一个正整数

A1-2017级算法上机第一次练习赛 L Bamboo的OS实验

题目描述 每周五Bamboo都要"恋恋不舍"的早退OS的上机实验千里迢迢来看望大家上机 :) 于是第二天Bamboo就要着手赶OS的ddl. 是这样,这次的OS实验给了x个编号为1-30的命令(比如5个命令1 2 3 3 3 ),要求在小黑窗上自己应用. 假设Bamboo每1分钟能完成一个命令,完成这些命令的顺序无所谓,以1分钟为单元,在1分钟里,Bamboo可以选择完成一个命令或者思考人生.更重要的是,为了不产生崩溃情绪,Bamboo要求在执行两个相同编号的命令之间必须要有n个分钟单

A1-2017级算法上机第一次练习赛 B ModricWang和数论

题目描述 给定一个正整数a,对于所有的正整数b,求a%b可能有多少种不同的值? 输入 一个整数a, 1≤a≤10181≤a≤1018 输出 一个整数,a%b可能出现的不同的值的个数 输入样例 3 输出样例 3 思路 懒得写了.应该也不会有人需要看. 参考代码 #include<stdio.h>   int main()   {       long long a;       scanf("%lld",&a);       if(a%2 == 0)         

A1-2017级算法上机第一次练习赛 G 股票交易

题目描述 一般一家公司的股票价格是不稳定的,就像图里所展示的这样,每时每刻的价格都在变.(图片来源网络) 现在,有一份很长很长的连续时间点股票价格数据(按时间从先到后顺序),老板需要你快速的寻找在这段数据范围内一次买卖股票的每股最大收益(假设所有人买卖股票都在给定时间点的数据范围内). 要想解决这个问题,你该怎么办? 输入 多组测试数据(10组左右),以EOF结尾. 每组测试数据分为两行第一行为数组长度n,正整数,代表股票价格数据长度,数据范围为0<n<=1000000 第二行为n个正整数,为

A1-2017级算法上机第一次练习赛 K 画个圈圈诅咒你

题目描述 AlvinZH最近很慌,先是被宋老师一句 "和我们有关系吗" 吓的不行,然后又被原老师批判了一番 "害怕" ,小日子整天过的提心吊胆的,没准儿这题就是你们做的AlvinZH的最后一题(不会的,后面还有一题). 不安的AlvinZH只能通过画圈圈诅咒那些威胁世界和平的人来安慰自己,他不是随便的画圈,所有的圈圆心都在同一条直线上,圈圈有大有小.AlvinZH看着这一个个连着的圈圈,突然想知道哪些圈圈是完全分开的. 请你帮他计算一下有多少对圈圈是完全分开的吧!

2017级算法模拟上机准备篇(一)

回顾一下往年的考题知识点: The Last Battle!! 2014级算法期末上机 简单题--I wanna be the 升级者Ⅰ 结构体排序  STL:sort() 简单题--I wanna be the 升级者Ⅱ 二分 :STL : lower_bound () 简单题--Railway Station 数据结构 : 栈操作模拟 简单题--我在东北玩泥巴:博弈论 中等题--零崎的考试:DP 中等题--伪流水线调度:费用流 网络流 中等题--果园连连看:BFS 图论 难题--线段和直线:

2017级算法第三次上机-B.SkyLee逛漫展

ALS 一道动态规划最经典的题目 动态规划实质上其实就是表格法,利用表格来记录每个子问题的解. DP所关注的其实是递归 即一个较小问题的解和一个较大问题的状态转移问题. 其次还要关注的其实还是是初始值的设立,这个决定了后续的递推能否顺利的进行. 还有要思考好dp数组所代表的具体的含义 这样在状态转移的过程中 也可以好一点理解. #include <iostream> #include <algorithm> #include <cstring> using namesp