圆环游戏

【题目描述】

现有n个人按照编号1~n的顺序顺时针围成一圈,从1号开始顺时针报数,报到t的人退出圈子,然后从他的下一位开始接着报数,询问最后一个退出圈子的人在哪个位置。

【输入描述】

输入两个数n、t。

【输出描述】

输出一个数,表示答案。

【输入样例】

3 2

【输出样例】

3

【数据范围及提示】

对于30%的数据,n <= 100;

对于100%的数据,n <= 100000,1 <= t <= 100。

源代码:

#include<cstdio>
struct Node
{
    int To,From;
}i[100001];
int N,T,Num=0,Ans=1;
int main() //暴力模拟也值得学习。
{
    scanf("%d%d",&N,&T);
    i[1].To=2; //注意首尾。
    i[1].From=N;
    i[N].To=1;
    i[N].From=N-1;
    for (int a=2;a<N;a++) //建环。
    {
        i[a].To=a+1;
        i[a].From=a-1;
    }
    while (i[Ans].From!=Ans&&i[Ans].To!=Ans) //还没只剩一个人。
    {
        Num++;
        if (Num==T) //去掉节点。
        {
            Num=0;
            i[i[Ans].To].From=i[Ans].From;
            i[i[Ans].From].To=i[Ans].To;
        }
        Ans=i[Ans].To;
    }
    printf("%d",Ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5931999.html