zcmu-1862 zbj的狼人殺(約瑟夫迴環變形)
阿新 • • 發佈:2018-12-17
Problem I: zbj的狼人殺
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 140 Solved: 44 [Submit][Status][Web Board]
Description
這天zbj和小夥伴總共n個人出去玩狼人殺,玩的正開心的時候又來了一群人總共n個,硬是要跟他們一起玩,所以他們想了一個遊戲規則準備趕走他們。規則是這樣的,所有人坐在圓桌旁,從第一個人開始報數,數到第m個人,則這個人出局;然後從出局的人之後開始數數,再將數到的第m個人出局.....依次方法不斷出局,直到最後只剩n個人,這時候,zbj希望剩下的n個人是他和他的小夥伴們,試問預先應該怎麼安排座位,能使得他完成心願?
Input
多組資料,每組資料輸入:人數n(<=100000)、步長m(<=32767);
Output
對於每一組資料,輸出2n個大寫字母,‘A’表示zbj和他的小夥伴,‘B’表示外來的那群人,50個字母為一行,不允許出現空白字元。相鄰資料間留有一空行。
Sample Input
2 3 2 4
Sample Output
ABBA BAAB
也就是約瑟夫迴環多了一個限制條件,原來的是要出列直到剩下1個人,現在要出列直到剩下n個人時就停止出列,並且儲存之前出列的人的位置編號,然後字串相應輸出A/B,
#include <cstdio> #include <vector> #include <algorithm> #include <iostream> #include <cstring> #define go(i,a,b) for(int i=a;i<=b;i++) #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int maxn = 1e5 + 5; vector<int> a; int b[maxn * 2];//注意要開兩倍 int main() { int n,m,x,t = 0; while(scanf("%d%d",&n,&m) != EOF) { if(t != 0) cout<<endl; t = 1; a.clear(); mem(b); x = 0; go(i,1,2*n) a.push_back(i); go(i,0,n-1) { x = (x + m - 1) % a.size(); b[a[x]] = 1; a.erase(a.begin() + x); } go(i,1,2*n) { if(b[i] == 1) cout<<"B"; else cout<<"A"; if(i % 50 == 0) cout<<endl; } cout<<endl; } return 0; }