poj 2359 Questions 约瑟夫问题

题意:输入一对字符串,按1999取数,判断最后剩下的数,是'?'输出“Yes” ,是' '输出“No”,不然输出“No comments”。

分析:约瑟夫环问题。

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
string s;
int N = 1999;
char c;
int main() {
    while((c = getchar()) != EOF) {
        if(c == '\n') continue;
        s += c;
    }
    int len =s.length();
    int cnt = 0;
    for(int i=2;i<=len;i++) {
        cnt = ( cnt + N ) % i;
    }
    if(s[cnt] == '?') printf("Yes\n");
    else if(s[cnt] == ' ') printf("No\n");
    else printf("No comments\n");
    return 0;
}

附:约瑟夫环的来历:

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

posted @ 2012-07-05 14:58  lenohoo  阅读(168)  评论(0编辑  收藏  举报