POJ——1012

  原以为POJ挂掉了,不知道是不是,最近连上google都够呛,啥水木也不太行,A了一水题

  又是约瑟夫环的变种,解答也再次让我无语了一次

  自己写的又超时了,后来发现此题可以开挂!!!当然话说回来,它的时间限制偏要让我不能直接输出,而偏偏得先把结果存入数组中

  原题:http://poj.org/problem?id=1012

  

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 bool IsOk(int k, int m)
 6 {
 7     int n = 2*k;
 8     int x = 1;
 9     while(n > k)
10     {
11         x = (x-1+m)%n;
12         if(x == 0)
13         {
14             x = n;
15         }
16         if(x <= k )
17         {
18             return false;
19         }
20         n--;
21     }
22     return true;
23 }
24 
25 int main()
26 {
27     int k = 0, m = 0;
28     int res[14] ;
29     for(k = 1; k <= 14; k++)
30     {
31         for(m=k+1;;m++)
32         {
33             if(IsOk(k,m))
34             {
35                 res[k-1] = m;
36                 break;
37             }
38         }
39     }
40     while(cin >> k && k != 0)
41     {
42         cout << res[k-1] << endl;
43     }
44     return 0;
45 }

  话说那个IsOk函数有另一个写法,区别很细微,以我的理解,一个是从1开始,另一个是从0开始

bool IsOk(int k, int m)
{
    int n = 2*k;
    int x = 0;
    while(n > k)
    {
        x = (x-1+m)%n;
        if(x < k )
        {
            return false;
        }
        n--;
    }
    return true;
}
posted @ 2012-08-29 22:03  Moondark  阅读(526)  评论(0编辑  收藏  举报