UVALive 4727 Jump

题目大意:约瑟夫环,给你n,k,让你输出最后三个被淘汰的是谁,然后输出。

思路:和约瑟夫环一样,为了处理方便,先把编号改为0开始,最后一个被删的,在人数为1时很明显,就是0,倒数第二个被删的,在人数为2时最明显,编号为(k-1)%2,倒数第三个时三个人,为(k-1)%3,然后一样,按照公式f[ n ] = (f[ n - 1 ] + k ) % n 。往前推就好。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN = 500055 ;

int d[MAXN];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        d[1] = 0;
        for(int i = 2;i<=n;i++)
            d[i] = (d[i-1]+k)%i;
        int ans1 = d[n];

        d[2] = (k-1)%2;
        for(int i = 3;i<=n;i++)
            d[i] = (d[i-1]+k)%i;
        int ans2 = d[n];

        d[3] = (k-1)%3;
        for(int i = 4;i<=n;i++)
            d[i] = (d[i-1]+k)%i;
        int ans3 = d[n];

        printf("%d %d %d\n",ans3+1,ans2+1,ans1+1);
    }
    return 0;
}


你可能感兴趣的:(UVALive 4727 Jump)