主题:求助:悬赏50分
tyflovewsl
[专家分:230] 发布于 2008-11-11 18:04:00
源程序名 JOSEPHUS.??? (PAS,BAS,C,CPP)
可执行文件名 JOSEPHUS.EXE
输入文件名 JOSEPHUS.IN
输出文件名 JOSEPHUS.OUT
时间限制 5S
原始的Josephus问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,……,n。从编号是1 的人开始报数,数到m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,……,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号是1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入
输入文件仅有一行包含一个整数k (0<k<14)。
输出
输出文件仅有一行包含一个整数表示使得最先出列的k个人都是坏人的m的最小值。
样例
JOSEPHUS.IN
4
JOSEPHUS.OUT
30
源程序名 STAIR.??? (PAS,BAS,C,CPP)
可执行文件名 STAIR.EXE
输入文件名 STAIR.IN
输出文件名 STAIR.OUT
时间限制 1S
设有一个N级的楼梯,编号从下以上依次为1至n,其中有若干级为坏的。有一个人上楼梯时一步可走1级、2级或3级(坏级只能跨过不能踏上,但级数照算)。问:这个人从楼下走到第N级,共有多少种不同的走法?
例如:当N=1时(无坏级情况下), 仅有1种走法
N=2时(无坏级情况下),有:1级+1级或2级 共2种走法
N=3时(第二级为坏级情况下),有:1级+2级或直接3级,共2种走法
输入
输入文件的第一行包含一个整数N(1≤N≤30),第二行为一个整数K(0<=K<=N)表示共有K级为坏的楼梯,接下来的K行每行包含一个整数,表示一级坏的楼梯的编号。
输出
输出文件的第一行且是唯一的一行应包含一个整数,表示这个人从楼下走到第N级的不同走法总数。
样例
STAIR.IN
3
1
2
STAIR.OUT
2
回复列表 (共4个回复)
沙发
kuailedale [专家分:210] 发布于 2008-11-11 18:09:00
program stair;
var n,k,i,place,f,r,tot:integer;
s:array[1..1000] of integer;
b:array[1..30] of boolean;
begin
assign(input,'stair.in'); reset(input);
assign(output,'stair.out'); rewrite(output);
readln(n);
readln(k);
fillchar(b,sizeof(b),true);
for i:=1 to k do begin readln(place); b[place]:=false; end;
f:=1; r:=2; s[1]:=0; tot:=0;
while f<r do
begin
for i:=1 to 3 do
if (s[f]+i<=n) and (b[s[f]+i]) then
if s[f]+i=n then inc(tot)
else begin s[r]:=s[f]+i; inc(r); end;
inc(f);
end;
writeln(tot);
close(input); close(output);
end.
不知道对不对啊 !
板凳
tyflovewsl [专家分:230] 发布于 2008-11-11 18:12:00
还有一题啊,回了给你30分
3 楼
kuailedale [专家分:210] 发布于 2008-11-11 19:08:00
program josephus;
var k,i,num:integer;
s:array[1..28] of boolean;
leave:boolean;
procedure print;
var i:integer;
begin
for i:=1 to 2*k do write(ord(s[i]),' ');
writeln;
end;
function can:boolean;
var i:integer;
begin
for i:=k+1 to k*2 do if s[i] then begin can:=false; exit; end;
can:=true;
end;
procedure find(m:integer);
var place,have_delete,have_pass:integer;
begin
fillchar(s,sizeof(s),true);
place:=0; have_delete:=0; have_pass:=0;
while not can do
begin
inc(place);
if place=2*k+1 then place:=1;
while not(s[place]) do
begin
inc(place);
if place=2*k+1 then place:=1;
end;
inc(have_pass);
if have_pass=m then
if place>k then
begin inc(have_delete); s[place]:=false; have_pass:=0; end
else begin leave:=false; exit; end;
end;
leave:=true;
end;
begin
assign(input,'josephus.in'); reset(input);
assign(output,'josephus.out'); rewrite(output);
readln(k);
leave:=false; num:=k;
while not leave do
begin
inc(num);
find(num);
end;
writeln(num);
close(input); close(output);
end.
好累的!!!
4 楼
tyflovewsl [专家分:230] 发布于 2008-11-11 19:10:00
program stair;
var n,k,i,place,f,r,tot:integer;
s:array[1..1000] of integer;
b:array[1..30] of boolean;
begin
assign(input,'stair.in'); reset(input);
assign(output,'stair.out'); rewrite(output);
readln(n);
readln(k);
fillchar(b,sizeof(b),true);
for i:=1 to k do begin readln(place); b[place]:=false; end;
f:=1; r:=2; s[1]:=0; tot:=0;
while f<r do
begin
for i:=1 to 3 do
if (s[f]+i<=n) and (b[s[f]+i]) then
if s[f]+i=n then inc(tot)
else begin s[r]:=s[f]+i; inc(r); end;
inc(f);
end;
writeln(tot);
close(input); close(output);
end.
program josephus;
var k,i,num:integer;
s:array[1..28] of boolean;
leave:boolean;
procedure print;
var i:integer;
begin
for i:=1 to 2*k do write(ord(s[i]),' ');
writeln;
end;
function can:boolean;
var i:integer;
begin
for i:=k+1 to k*2 do if s[i] then begin can:=false; exit; end;
can:=true;
end;
procedure find(m:integer);
var place,have_delete,have_pass:integer;
begin
fillchar(s,sizeof(s),true);
place:=0; have_delete:=0; have_pass:=0;
while not can do
begin
inc(place);
if place=2*k+1 then place:=1;
while not(s[place]) do
begin
inc(place);
if place=2*k+1 then place:=1;
end;
inc(have_pass);
if have_pass=m then
if place>k then
begin inc(have_delete); s[place]:=false; have_pass:=0; end
else begin leave:=false; exit; end;
end;
leave:=true;
end;
begin
assign(input,'josephus.in'); reset(input);
assign(output,'josephus.out'); rewrite(output);
readln(k);
leave:=false; num:=k;
while not leave do
begin
inc(num);
find(num);
end;
writeln(num);
close(input); close(output);
end.
我来回复