M.J的blog

algorithm,ACM-ICPC
随笔 - 39, 文章 - 11, 评论 - 20, 引用 - 0
数据加载中……

TOJ 1007 Joseph

别人的思路,有点递归的意思。程序本身超时,但可以利用它来打表。

这个题目其实就是要求前k次踢掉的都是坏人,假设第i次踢掉的人是i,则i>k。根据题意,可以得到如下关系:
设 ai 是第i次踢掉的人在第i-1次踢掉后剩下的人中是第几个。那么

a(n) = [a(n-1)+m-1]mod(2k-n+1)
要求a(n) > k;n = 1,2,3,...,k
其中2k-n+1是第i-1次踢人后剩下的人数

 1 bool Joseph(int k, int m) // 这个算法确定对于给定的k,m是否满足上面的要求

 2 {
 3     int n=0,a=1;
 4     for(n=1;n<=k;n++)
 5     {
 6         a = (a+m-1)%(k*2-n+1);
 7         if(a == 0)  a = k*2-n+1;
 8         if(a<=&& a>=1)  return false;
 9     }
10     return true;
11 }
Code:
 1#include<iostream>
 2using namespace std;
 3bool judge(int k,int m)
 4{
 5   int i,j=1;         
 6   for(i=1;i<=k;i++)
 7   {
 8        j=(j+m-1)%(k*2+1-i);
 9        if(j==0)  j=k*2+1-i;
10        if((j<=k)&&(j>=1)) 
11            return false;
12   }

13   return true;
14}

15int main()
16{
17    int k,m,i,j,n;
18    while(cin>>k)
19    {
20        if(k==0)  break;
21        for(m=k+1;;m++)
22        {
23            if(judge(k,m))
24            {
25                cout<<m<<endl;
26                break;
27            }

28        }

29    }

30}

posted on 2010-04-23 19:59 M.J 阅读(149) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理