(搜索问题)pascal解决 猴子吃香蕉(monkey)

来源:百度知道 编辑:UC知道 时间:2024/05/26 07:39:21
在线等源程序(一定要正确的~!)
要pascal的能够过大部分数据的~~
速度啊~

-----------------------------------------------------

有n只猴子,编号1到n。猴子得到一些香蕉,每只猴子拥有的香蕉数量也是1到n,并且任意两只猴子拥有的香蕉数量都不相同。
现在,所有猴子开始吃香蕉。编号是i的猴子决定要吃i只香蕉,1<=i<=n。如果它拥有的香蕉足够,那就最好;如果不够,先吃完自己的,然后它就要问饲养员要香蕉。总之要吃i只香蕉。
如果有某一只猴子吃完了自己的香蕉,而且正好够(不用问饲养员要),那么它会变得比较郁闷,所以我们不允许任何一只猴子出现这种情况。
问最终吃完香蕉后,可能出现多少种不同的情况。在两个方案中,只要存在一只猴子的两次情况不一样,这两个方案就是不同的。

输入:monkey.in
一个正整数n。

输出:monkey.out
情况总数。

样例
输入:
2
输出:
1

输入:
3
输出:
2
说明:
如果3只猴子依次拥有3、1、2只香蕉,那么1号猴子最后剩2只,2号猴子要了1只,3号猴子要了1只,这是一个方案。另一个方案是3只猴子依次拥有2、3、1只香蕉,那么1号猴子最后剩1只,2号猴子剩1只,3号猴子要了2只。
但如果3只猴子依次拥有2、1、3只香蕉,那么3号猴子会郁闷,不符合要求。

这是
错位排列数列
0,1,2,9,44,265,....
递推公式祥见代码;
提交时,记得一定要把文件名改为monkey.pas
program liuke_cuopai;
var
i,k,a,b,c:longint;
begin
assign(input,'monkey.in');
assign(output,'monkey.out');
reset(input);
rewrite(output);
readln(k);
a:=0;
b:=1;
for i:=3 to k do
begin
c:=(a+b)*(i-1);
a:=b;
b:=c;
end;
if k=1 then writeln(a) else if k=2 then writeln(b) else
writeln(c);
close(input);
close(output);
end.

错排公式:
f(n)=(f(n-1)+f(n-2))*(n-1)
f(1)=0,f(2)=1.
program liuke_cuopai;
var
i,k:longint;
a,b,c:qword;
begin
assign(input,'monkey.in');
assign(output,'monkey.out');
reset(input);
rewrite(output);
readln(k);
a:=0;
b:=1;
for i:=3 to k do
begin
c:=(a+b)*(i-1);
a:=b;
b:=c;
end;
if