Counting-out Rhyme
题意:
n 个孩子在玩一个游戏。 孩子们站成一圈,按照顺时针顺序分别被标号为 1 到 n。开始游戏时,第一个孩子成为领导。 游戏进行 k 轮。 在第 i 轮中,领导会从他顺时针方向下一个孩子开始数 ai 个孩子。最后数到的那个孩子出局,再下一个孩子成为新的领导。
举个例子, 现在圈内还剩 [8, 10, 13, 14, 16] 4个孩子,领导编号为 13 , ai = 12。那么出局的孩子为 16 。第 8 个孩子成为下一个领导。
你需要写一个代码模拟这个过程,求出每轮比赛出局的孩子。
Input
Output
第一行包含两个整数 n 和 k (2 ≤ n ≤ 100, 1 ≤ k ≤ n - 1).
第二行包含 k 个整数 a1, a2, ..., ak (1 ≤ ai ≤ 109).
输出 k 个整数,第 i 个整数表示第 i轮出局的孩子。
直接模拟一遍就好,对于k轮中的每一轮,先计算要往后数多少个人,找出出局者,然后再往后找新的领导者,重复循环即可。
#include<iostream> using namespace std; #define maxn 110 int a[maxn]={0}; int main() { int n,k,x; cin>>n>>k; int cnt,first=1,ans; for(int j=0;j<k;j++) { cin>>x; cnt=x%(n-j);//n-j表示本轮还剩n-j个人 if(cnt==0)//出局者是领导者自己 cnt=n-j; for(int i=first+1;;i++) { if(i>n) i=1; if(a[i]==0) cnt--; if(cnt==0)//找到最后一个人 { a[i]=1; ans=i; for(int l=i+1;;l++)//寻找下一个领导者 { if(l>n) l=1; if(!a[l]) { first=l; break; } } break; } } cout<<ans<<" "; } return 0; }