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; }
《具体数学》里这个算法是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; }

浙公网安备 33010602011771号