zoukankan      html  css  js  c++  java
  • Pascal 语言中约瑟夫问题:幸运观众

    【题目】节目主持人准备从n名学生中挑选一名幸运观众,因为大家都想争当幸运观众,老师只好采取这样的办法:全体同学站成一列,由前面往后面依顺序报数。1,2,1,2……报单数的同学退出队伍,剩下的同学向前靠拢后,再重新由前往后1,2,1,2……报数,报单数者退出队伍,如此下去最后剩下一人为幸运观众。编程找出幸运观众,在原队列中站在什么位置上?(n由键盘输入,n<255)

    【上手】
    首先可以先打下草稿:这里假设有6位学生(出列学生用0代替)
    一开始的位置:[1]  [2]  [3]  [4]  [5]  [6]
    第一轮报数:     1   2    1     2    1    2
    第一轮筛选:     0  [2]    0   [4]   0   [6]
    第二轮报数:     0   1     0    2    0    1
    第二轮筛选:     0    0    0   [4]   0    0
    -------------------------------------------------------------------
    一开始我的思路是把非0的号码填充到0,后面想到可以直接提取所有非零号码直接代替原数组。
    代码如下:
      1. 1 for i:=1 to n do
        2 if a[i]<>0 then
        3 begin
        4 inc(j);
        5 b[j]:=a[i];
        6 end;
    这的确是一个方法但我个人觉得略显繁琐,那么我们再仔细看一看先前打的草稿,是不是发现了什么?
    对,我们可以直接调用 div 来重新报数:
    1. for i:=1 to n do a[i]:=a[i] div 2;
    是不是豁然开朗了呢?
  • 相关阅读:
    C盘格式化
    电脑显示器有波纹抖动怎么办
    磁盘碎片
    如何把Excel另存为XML格式文件(快速转换)
    题目1551:切蛋糕
    题目1552:座位问题
    题目1550:分糖果
    题目1493:公约数
    题目1544:数字序列区间最小值
    RMQ (Range Minimum/Maximum Query)算法
  • 原文地址:https://www.cnblogs.com/RhinoC/p/4301965.html
Copyright © 2011-2022 走看看