回 帖 发 新 帖 刷新版面

主题:求助:悬赏50分

源程序名    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个回复)

沙发

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.
不知道对不对啊 !

板凳

还有一题啊,回了给你30分

3 楼

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 楼


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.
 

我来回复

您尚未登录,请登录后再回复。点此登录或注册