hdu 1443 Joseph+暴力打表

题目大意:k个好人,k个坏人,确定n,利用Joseph方法删除所有坏人.

由于数据规模,可以利用暴力打表,以后能打表就尽量打表。

这题原本模拟数据时间完全够的,但是测试数据有很多重复的,导致很多人超时,暗坑!!!!

以后要注意点这种情况。

打表:

#include<stdio.h>

int main(){
 int n,a[14]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
 while(scanf("%d",&n)&&n) 
                   printf("%d\n",a[n]);
 return 0;
}

/*
题目总结: 注意学习,模拟约瑟夫循环的过程!

三个方程:

 kill=(ans+ans - 1)%sum    //下一处要删除的位置

if(kill==0)kill=sum;    //为零的特殊情况

sum--;             //人数减一

*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
int res[16];
int joseph(int n)
{
    int ans, flag, sum;
    if(res[n])
        return res[n];
    else
    {
        for(ans = n + 1; ; ++ans)
        {
            flag = 0;
            sum = 2 * n;
            for(int j = ans; ; j += ans - 1) //人数减1
            {
                if(j > sum)
                    j = j % sum ? j % sum : sum; //人数减1
                if(j <= n)
                    break;
                else
                    sum--;

                if(sum == n)
                {
                    flag = 1;
                    break;
                }
            }
            if(flag)
            {
                res[n] = ans;
                return res[n];
            }
        }
    }
}
int main()
{
    int n;
    while(cin>>n,n)
    {
        cout<<joseph(n)<<endl;
    }
    return 0;
}


posted @ 2012-12-03 16:33  amourjun  阅读(207)  评论(0编辑  收藏  举报