站外题求助!!
  • 板块题目总版
  • 楼主Sirius_H2SO4
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/2 13:57
  • 上次更新2024/3/2 15:30:18
查看原帖
站外题求助!!
1029903
Sirius_H2SO4楼主2024/3/2 13:57

班里共有 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

2024/3/2 13:57
加载中...