poj 3517

题目链接  http://poj.org/problem?id=3517

题意        约瑟夫环  要求最后删掉的那个人是谁;

方法        理解递推公式就行了  考虑这样一组数据  k = 3 是

      长度为 N 的约瑟夫环        k,k+1,k+2,k+3,k+4,k+5,k-2, k-1

      长度为N-1的约瑟夫环     0,  1,   2,     3,     4,   5,  n-2, n-1

      则 f[n] = (f[n-1]+k)%N;

可以将第一步 预处理出来; 然后 套公式就行了;

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;

int arr[10004],cnt[10004],f[10004];
int main( )
{
    int N,M,K;
    while( scanf("%d%d%d",&N,&K,&M) != EOF )
    {
        if( !N )break;
        for( int i = 1; i <= N; i++ )
          arr[i] = i;
        while( M > N ) M -= N; arr[M] = -1; int k = 0;
        for( int i = 1; i <= N; i++ )
        if( arr[i] == -1 )
        {
            for( int j =i+1; j <= N; j++ )cnt[k++] = arr[j];
            i = N+1;
        }
        for( int i = 1; i <= N; i++ )
        if( arr[i] != -1 )cnt[k++] = arr[i];
        else break;
        f[0] = 0;
        for( int i = 1; i < k; i++ )f[i] = (f[i-1]+K)%(i+1);
        cout<<cnt[f[k-1]]<<endl;
    }
    return 0;
}
View Code

 

          

posted on 2013-11-18 10:31  浪舟  阅读(179)  评论(0编辑  收藏  举报

导航