Timus: [1098. Questions]

Timus: [1098. Questions]

约瑟夫环问题,把《具体数学》里的算法拿来用了一下。

#include <stdio.h>

#define MAX_SIZE 30000

char text[MAX_SIZE];

const int N = 1999;

int m;
void input()
{
    char c;
    m = 0;
    while (~(c = getchar()))
    {
        if (c != '\n')
            text[m++] = c;
    }
}

const char* solve()
{
    long long z = 1;
    while (z < (N - 1LL) * m + 1)
    {
        z = (z * N + N - 2) / (N - 1);
    }
    switch (text[m * N - z])
    {
    case '?':
        return "Yes";
    case ' ':
        return "No";
    }
    return "No comments";
}

int main()
{
    input();
    printf("%s\n", solve());
    return 0;
}
Solution

 《具体数学》里这个算法是O(lgn)的时间,然而,似乎在这些test case下比下面这个O(n)时间的算法更耗时。

#include <stdio.h>

#define MAX_SIZE 30000

char text[MAX_SIZE];

const int N = 1999;

int m;
void input()
{
    char c;
    m = 0;
    while (~(c = getchar()))
    {
        if (c != '\n')
            text[m++] = c;
    }
}

const char* solve()
{
    int z = 0;
    for (int k = 2; k <= m; ++k)
    {
        z = (z + N) % k;
    }
    switch (text[z])
    {
    case '?':
        return "Yes";
    case ' ':
        return "No";
    }
    return "No comments";
}

int main()
{
    input();
    printf("%s\n", solve());
    return 0;
}
The O(n) algorithm.

 

posted @ 2018-11-17 20:29  knull  Views(140)  Comments(0)    收藏  举报