绿盟科技2022校招研发工程师的一题,考试的时候没做出来,现在来做个记录。有问题的话请指出。
题目描述:
一个游戏,有的的规则如下:
(1)所有参与者围成一个圆圈坐下,编号为1 2 3 4 5…
(2)每个人有一块白板,写一个大于零的整数Nx.
(3)主持人在白板上写下一个大于零的数N1,随后随机指定一人开始游戏
(4)从这个人开始从1报数,数到N1的人将会被淘汰出局
(5)被淘汰的人向所有人展示其白板上写的数字Nx
(6)被淘汰的人下一位开始从1报数,数到Nx的人再次淘汰
(7)直到最后一个人,最后一个人胜利
输入描述:
(1)一组数字,
(2)第一个表示参加的人数N,第二个表示主持人指定的游戏开始的人的序号,第三个表示第一次的Nx,第4到N+4表示每个参与者写在板上的数字。
输出胜利者的序号。
#include<iostream>
#include<vector>
using namespace std;
int game(int N, int begin, int first_password, vector<int> password) {
//N总人数,begin第一个开始的位置,first_password第一个淘汰的数,password每个人写的淘汰的数。
begin = begin - 1; //后面的下标都从零开始
int x = first_password%N;
int temp = begin + x - 1; //余1的时候回到了他自己
int pass = temp % N; //计算第一个被淘汰的人
int next_password = password[pass];
password[pass] = -1; //被淘汰标记为-1
for (int i = 0; i < N - 1; ++i) {
//如果有10个人,现在再循环9次,找到最后一个被淘汰的就行了
temp = 0; //因为pass指向上一个被淘汰的人,所以下次报数从0开始,
while (temp != next_password) {
++pass;
if (pass >= N) pass -= N;
if (password[pass] != -1) ++temp;
}
next_password = password[pass];
//cout << pass << " ";
password[pass] = -1; //被淘汰标记为-1
}
return pass + 1; //返回值的下标从1开始。
}
int main() {
int N;
cin >> N;
int begin;
cin >> begin;
int first_password;
cin >> first_password;
vector<int> password(N, 0);
for (int i = 0; i < N; ++i) {
int temp;
cin >> temp;
password[i] = temp;
}
int winer = game(N, begin, first_password, password);
cout << winer;
system("pause");
return 0;
}