练习:【问题描述】
有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直
数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只
剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入:每行是用空格分开的两个整数,
第一个是n,第二个是m(0<m,n<=300)。
【输入样例] 6 2
【输出样例】5
#include <bits/stdc++.h>
using namespace std;
int main(){
// 第一步:初始化队列,为队列中的元素进行编号。
int q[100],n,k,j,front=0,rear=0;
cin >> n >> k;
for(int i = 1; i <= n; i++){
q[++rear] = i;
}
//第二步:指定报数的序号,没到序号的元素插入队尾,到达序号的元素进行出队。
while(front < rear){
j = k; //报数12还是2123..。
while(j > 1){
q[++rear] = q[++front];
j--;
}
++front;
}
cout << q[rear] << endl;
return 0;
}
信息奥赛一本通1418
由经典约瑟夫问题改成。
有NN个猴子,编号从11到NN。每个猴子对应一个正整数XiXi,表示如果从编号为ii的猴子开始报数,需要数到XiXi。
这NN个猴子围成一圈,从第一个开始报数,数到第11个猴子对应的正整数X1X1的猴子出队,然后从它的下一位继续从11开始报数,数到对应的XiXi时出队,如此循环直到剩下一个猴子,最后剩下的那个猴子就是猴子们选出的大王。
例如:
N=5,XiN=5,Xi对应为:1,2,3,4,51,2,3,4,5。
出队的顺序为:1,3,4,51,3,4,5。
#include<bits/stdc++.h>
using namespace std;
int n,a[1000010];
int main()
{
queue<int> que;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
que.push(i);
}
while(que.size()!=1)
{
int m=a[que.front()];
for(int j=1;j<=m-1;j++)
{
que.push(que.front());
que.pop();
}
que.pop();
}
cout<<que.front();
return 0;
}
基础编程题目集 编程题 PTA 7-28
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
输入样例:
11
输出样例:
7
#include <bits/stdc++.h>
#define N 1010
using namespace std;
int main(){
int n;
cin >> n;
int monkey[N];
for(int i = 1; i <= n; i++){
monkey[i] = 1;
}
int t = n;
int cnt = 0;
int p = 1;
while (t > 1){
if(monkey[p] == 1){
cnt++;
}
if(cnt == 3){
monkey[p] = 0;
cnt = 0;
t--;
}
p++;
if(p > n){
p = 1;
}
}
for(int i = 1; i <= n; i++){
if(monkey[i] == 1){
cout << i << endl;
break;
}
}
return 0;
}
又来一道类似的题:一个小学三年级的小学生录制视频写的代码。
这是数完一轮倒着报

输入10
输出8
90
38
#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e7 + 10;
int f[N];//出去的置为1
int main(){
int n;
cin >> n;
int tot = n,flag = 1;
while(1){
int cnt = 0;
for(int i = 1; i <= n; i++){
//退出的不用报了
if(f[i] == 1) continue;
cnt ++;//报的数
if(cnt == 3){
f[i] = 1;
cnt = 0;
tot--;
}
}
flag = 2;
cnt = 0;
if(tot < 3) break;
//反着报数
for(int i = n; i >= 1; i--){
if(f[i] == 1) continue;
cnt ++;//报的数
if(cnt == 3){
f[i] = 1;
cnt = 0;
tot--;
}
}
flag = 1;
cnt = 0;
if(tot < 3) break;
}
//
if(flag == 1){
for(int i = 1; i <= n; i++){
//报1的为王
if(f[i] == 0){
cout << i ;
break;
}
}
}else{
for(int i = n; i >= 1; i--){
if(f[i] == 0){
cout << i ;
break;
}
}
}
return 0;
}
1576

被折叠的 条评论
为什么被折叠?



