文章

81

粉丝

2

获赞

531

访问

13.7k

头像
击鼓传花 题解:
P1018 贵州大学机试题
发布于2026年3月11日 17:11
阅读数 176

#include <iostream>
using namespace std;

int main(){
    int n;
    cin >> n;

    int ans = 0;

    for(int i = 2; i <= n; i++){
        ans = (ans + 3) % i;
    }

    cout << ans + 1;

    return 0;
}

约瑟夫环公式:f(n) = (f(n-1) + k) % n

程序首先读取输入的人数 n。为了表示最后留下的小朋友位置,定义变量 ans,表示当前人数情况下最后留下者的下标(从 0 开始)。当只有 1 个人时,显然留下的下标为 0,因此将 ans 初始化为 0。

随后通过循环从 2 一直计算到 n。每增加一个人时,根据上一轮结果更新当前留下者的位置。更新公式为 ans = (ans + 3) % i,其中 i 表示当前人数,3 表示每次数到第 3 个出局。由于每次删除一个人后,剩余人的编号会整体发生移动,因此需要在上一轮结果的基础上向前移动 3 个位置,并通过取模运算保证下标仍然在当前人数范围内。

循环结束后,ans 表示最终留下者的下标,但该下标是从 0 开始计数,而题目中的编号是从 1 开始,因此输出时需要加 1,即输出 ans + 1。通过这种递推方式,可以避免逐个模拟出局过程,使程序更加简洁高效。

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发