新约瑟夫游戏

题目描述

你一定听说过经典“约瑟夫”问题吧?现在来组织一个皆大欢喜的新游戏:假设 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
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<

 

你可能感兴趣的:(无)