永发信息网

2004年 NOIP 完善程序

答案:1  悬赏:0  手机版
解决时间 2021-06-01 19:08
  • 提问者网友:龅牙恐龙妹
  • 2021-05-31 19:22

Joseph
题目描述:
原始的Joseph问题的描述如下:有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的最小值。
输入样例:
4
输出样例:
30
程序:
program progaram1;
var
i,k,m,start:longint;
find:boolean;
function check(remain:integer):boolean;
var result:integer;
begin
result:= ① mod remain;
if ② then begin
start:=result; check:=true;
end
else check:=false;
end;
begin
find:=false;
read(k);
m:=k;
while ③ do begin
find:=true; start;=0;
for i:=0 to k-1 do
if (not check(④ )) then begin
find:=false; break;
end;
inc(m);
end;
writeln( ⑤ );
end.

这题的思路到底是什么 完全不明白

不要答案 要思路

最佳答案
  • 五星知识达人网友:英雄的欲望
  • 2021-05-31 20:49

3空,not find就是还没找到合适的m。


主程序的i是总出列的人数。


check是判断所选的m是否满足要求。


4空为2*k-i 即剩下的人数。


5空为m-1因为inc(m)在后面,跳出循环前多加了1.


围成圈的话它的号是0~2*k-1 而不是1~2*k。因为当数到m时出列的序号为m mod m=0;


1空为start+m-1,就是起始位置往后数m位,-1是因为刚才围成圈的序号都少了1。


mod remain因为是绕圈的。


2空为result>=m 判断找出来的人是好人还是坏人,因为序号都少了1,所以坏人是从第k个开始起的。



纯原创手打

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯