题目链接:https://www.luogu.com.cn/problem/CF792B
问题描述:
n 个孩子在玩一个游戏。 孩子们站成一圈,按照顺时针顺序分别被标号为 1 到 n。开始游戏时,第一个孩子成为领导。 游戏进行 k 轮。 在第 i 轮中,领导会从他顺时针方向下一个孩子开始数 ai 个孩子。最后数到的那个孩子出局,再下一个孩子成为新的领导。
举个例子, 现在圈内还剩 [8, 10, 13, 14, 16]5个孩子,领导编号为 13 , ai = 12。那么出局的孩子为 16 。第 8 个孩子成为下一个领导。
你需要写一个代码模拟这个过程,求出每轮比赛出局的孩子。
第一行包含两个整数 n 和 k (2 ≤ n ≤ 100, 1 ≤ k ≤ n - 1).
第二行包含 k 个整数 a1, a2, ..., ak (1 ≤ ai ≤ 109).
输出 k 个整数,第 i 个整数表示第 i轮出局的孩子。
解题思路:
①找到并删除对应位置的号数,可以运用到动态数组的erase。
②再计算找出下一个要删除的号数与上一局号数的关系。
算法描述:
#include<iostream>
#include<vector> //运用动态数组
using namespace std;
int main(){
int n,k,D,boss=0;
vector<int>kid;
cin>>n>>k;
for(int i=1;i<=n;i++) kid.push_back(i); //将小孩的号码对应从后塞入vector中
while(k--){
cin>>D;
boss=(boss+D)%(kid.size()); //用%来找到多次轮回后要删除出局的小孩
cout<<kid[boss]<<" "; //eg:要出局第3个,则为kid[2];
kid.erase(kid.begin()+boss); //将对应位置删除,则begin()开始为1
}
return 0;
}
分析,讨论与总结:
通过本题更加熟练的运用了vector,对push_back()和erase()和begin()有了更深的认识,对于循环和删除的结合下次可以将vector考虑其中。过程中还尝试了循环链表和顺序链表,并不能通过测试点,知识点没有掌握好,要再去巩固学习。