新约瑟夫游戏

题目描述

你一定听说过经典“约瑟夫”问题吧?现在来组织一个皆大欢喜的新游戏:假设 n 个人站成一圈,从第 1 人开始交替的去掉游戏者,但只是暂时去掉(例如,首先去掉 2),直到最后剩下唯一的幸存者为止。幸存者选出后,所有比幸存者号码高的人每人将得到 1 块钱,并且永久性地离开,其余剩下的人将重复以上过程,比幸存者号码高的人每人将得到 1 块钱后离开。一旦经过这样的过程后,人数不再减少,最后剩下的那些人将得到 2 块钱。请计算一下组织者一共要付出多少钱?

例如,第一轮有 5 人,幸存者是 3,所以 4、5 得到 1 块钱后离开,下一轮幸存者仍然是 3,因此没有人离开,所以每人得到 2 块钱,总共要付出 2+2*3=8 块钱。(从二开始淘汰 依次为2 4 1 5 每次跳过一个淘汰)

输入:

一行一个整数 n。

输出:

一行一个整数,不超过65535,表示总共要付出多少钱。

样例输入

10

样例输出

13

数据范围:n < 32767。

思路:参考链接https://blog.csdn.net/qq_32451161/article/details/50754299得出公式 然后计算就OK。

#include<iostream>
using namespace std;
int a[33000],b[33000];
int main()
{
    int n,i=2;
    cin>>n;//输入
    a[1]=1;
    b[1]=1;
    while(i<=n)
    {
        b[i]=(b[i-1]+1)%i+1;//此公式可人为推得 我也解释不清......
        if(b[i]==i) a[i]=i;
        else a[i]=a[b[i]];//金币数
        i++;
    }
    cout<<a[n]+n;//输出
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值