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个位置,于是逃过了这场死亡游戏。