班里共有 m 名同学,班主任将 m 名学生为围成一个圈,从 1 到 m 进行编号,然后挑选一个数字 n(1<n<9),从第一个同学开始,从 1 到 n 报数,报到 n 的同学就出局,然后下一位同学重新从 1 开始报数,留下的最后一名同学就是小寿星。
由于女生少,班主任决定:每名女生第一次数到 n 不会立刻出局,第二次数到 n 时出局。 例如,m=4,其中有 1 名女生,编号顺序为 1,2,3,4,分别是男,女,男,男,n=2,第一轮报数,报到的是 2 号女生,暂不出局。第二轮报数,四号男生报 2 出局。第三轮报数,二号女生报 2 出局。第四轮报数,1 号男生报 2 出局,最后留下 3 号男生,输出 3。
输入描述: 第一行,一个正整数 m,表示班上的学生人数; 第二行,m 个正整数 s1,s2,s3……sm,用空格分隔,si=1 表示编号 i 的学生是男生,si=0 表示编号为 i 的学生是女生; 第三行,一个正整数 n,表示数到 n 的人出局(注意:女生有 2 次机会)
输出描述: 输出最后留下的学生的编号。
#include<bits/stdc++.h>
using namespace std;
int m,n;
struct twin{
int a;
bool b,chance=1;
};
int main(){
int now=0;
cin >> m;
twin classmates[m];
for(int i=0;i<m;i++){
cin >> classmates[i].b;
classmates[i].a=i+1;
}
cin >> n;
classmates[m-1].a=0;
while(m!=1){
for(int i=0;i<n;i++){
now=classmates[now].a;
}
if(!(classmates[now-2].b)&&classmates[now-2].chance){
classmates[now-2].chance-=1;
continue;
}
classmates[now-2].a++;
m--;
}
cout << now+1;
}
我知道这个就是约瑟夫plus但是,我太菜了做不出来(泪)求助各位大佬谷u