Type: Default 1000ms 256MiB

[伴随编程] 实现报数游戏

You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.

这一节我们借助队列来辅助完成报数游戏的计算。

  1. 为了使得我们写的程序更通用,我们假设有 n 个小朋友,报到 m 的小朋友退出游戏,首先定义两个变量,然后从标准输入中读入。

在main函数里面写下

int n, m; 
cin >> n >> m;
  1. 定义一个int类型的队列q。

在main函数里面接着刚才的输入写下

queue<int> q;

记得在开头 加上头文件

  1. 我们知道他们的报数顺序为 1 到 n,我们按照这个顺序把它们依次压入队列。

queue<int> q;下面写下

for (int i = 1; i <= n; i++) { 
    q.push(i); 
}
  1. 现在我们开始模拟报数过程,定义一个变量cur来表示当前正在报的数,初始的时候从 1 开始。当队列中剩下的人数大于 1 的时候,游戏都还在进行。

    从队首取一个小朋友,如果这个小朋友报数正好是 m,那他就退出游戏,然后下一个小朋友从 1 开始报数。

在main函数里面继续写下

	int cur =1;					//4
    while(q.size() > 1){		//4
        int x=q.front();		//4
        q.pop();				//4
        if(cur==m){				//4
            cur =1;				//4
        }
    }
  1. 那如果这个小朋友报的数不是 m,那么他还需要继续游戏,他刚报完数,需要等过一圈以后才会再次报数,我们让这个小朋友重新入队。

在while循环里面写下另外一种情况

int cur =1;					//4
    while(q.size() > 1){		//4
        int x=q.front();		//4
        q.pop();				//4
        if(cur==m){				//4
            cur =1;				//4
        }else{					//5
            q.push(x);			//5
            cur++;				//5
        }
  1. 最后我们输出剩下的小朋友的编号。 在已经完成的while循环下面写下

cout << q.front() << endl;

  1. 点击 运行,输入7 5 可以得出上一个填空题的结果。

202402240000

Not Attended
Status
Done
Rule
ACM/ICPC
Problem
22
Start at
2024-2-24 13:00
End at
2024-2-24 15:30
Duration
2.5 hour(s)
Host
Partic.
9