数组-11. 猴子选大王(20)

数组-11. 猴子选大王(20)

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

徐镜春(浙江大学)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(<=1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7
//下面思路错误,一开始用erase,但是发现好像迭代器会发抽
//后来用把轮到3的元素变成0,发现也不行,因为会涉及到重复变成3的情况
// #include <iostream>
// #include <list>
// using namespace std;

// int sum(list<int> num)
// {
//     int s = 0;
//     for (auto i : num)
//     {
//         if (i == 0)
//             ++s;
//     }
//     return s;
// }
// int main()
// {
//     int N;
//     cin >> N;
//     list<int> num;
//     for (int i = 1; i <= N; ++i)
//     {
//         num.push_back(i);
//     }
//     int flag = 0;
//     auto it = num.begin();
//     while (sum(num) != N - 1 )
//     {
//         if (it == num.end())
//         {
//             it = num.begin();
//         }
//         ++flag;
//         if (flag == 3)
//         {
//             *it = 0;
//             flag = 0;
//         }
//         ++it;   //next iter
//        // cout << *it << endl;
//     }
//     for (auto i : num)
//     {
//         if (i != 0)
//         {
//             cout << i << endl;
//         }
//     }
//     return 0;
// }

最后把erase改了下,就可以用erase了!

#include <iostream>
#include <list>
using namespace std;

int main()
{
    int N;
    cin >> N;
    list<int> num;
    for (int i = 1; i <= N; ++i)
    {
        num.push_back(i);
    }
    int flag = 0;        //标志1,2,3
    auto it = num.begin();
    while (num.size() > 1)
    {
        ++flag;
        if (flag == 3)
        {
            it = num.erase(it); //注意删除后it就无效了,不能再去++!!!
            //erase会返回被删除元素下一个的指针
            flag = 0;
        }
        if (flag != 0)      //一开始这里弄错,由于删除时的保存操作,导致若删除了的话自动会移动到下一个的
            ++it;   //next iter
        if (it == num.end())
        {
            it = num.begin();
        }
    }
    cout << *num.begin() << endl;
    return 0;
}

时间: 2024-09-29 20:48:59

数组-11. 猴子选大王(20)的相关文章

数组-11. 猴子选大王

数组-11. 猴子选大王(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(<=1000). 输出

PAT-JAVA-5-28 猴子选大王 (20分)

一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(\le≤1000). 输出格式: 在一行中输出当选猴王的编号. 输入样例: 11 输出样例: 7 这道题是一道类似约瑟夫环问题. 约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后

第4章-17.猴子选大王 (20分)

一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(≤1000). 输出格式: 在一行中输出当选猴王的编号. 输入样例: 11 输出样例: 7 1 # 猴子吃桃问题 2 # Author: cnRick 3 # Time : 2020-3-2

7-28 猴子选大王(20 分)

7-28 7-28 猴子选大王(20 分) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(≤1000). 输出格式: 在一行中输出当选猴王的编号. 输入样例: 11 输出样例: 7 AC代码 #include<stdio.h> int

数据结构实践——猴子选大王(数组版)

本文针对数据结构基础系列网络课程(5): 数组与广义表的实践项目. [项目 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号猴子. 要求采用数组作为存储结构完成. [参考解答1] 在一个数组中,数组中用1表示猴子在圈中,用0表示猴子已经出圈,数组下标对应与猴子编号对应(例如数组元素p[0

数据结构实践——猴子选大王

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目 - 猴子选大王] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.输入m和n,输出为大王的猴子是几号. 提示: (1)链表解法:可以用一个循环单链表来表示这一群猴子.表示结点的结构体中有两个成员:一个保存猴子的编号,一个为指向下一个人的指针,编号为m的结点再指向编号为1的结点,以此构成环形的链.

sicily 猴子选大王

题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数字是M,则该猴子出列,下一只猴子重新从1开始报数.剩下的猴子继续排成一个圆圈报数,直到全部的猴子都出列为止.最后一个出列的猴子胜出. 输入格式 The first line is an integer t, indicating the number of test cases. Then ther

猴子选大王

M只猴子要选大王,选举办法如下:所有猴子按1,2--n编号围成一圈,从第一号开始顺序报数1,2--m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王. 数据结构: 猴子链表,循环    猴子属性值:判断是否落选 利用单向循环链表模拟此过程,输出选出的大王编号. 程序的设计思想: (1)问题分析:"猴子选大王"问题是约瑟夫环问题的一个特例.由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间.而该问题又是一个不断的循环问题所以用循环链表来实现. (

猴子选大王(约瑟夫问题)JAVA实现

问题 猴子选大王,假设有M个猴子围成一圈,从1开始报数,数到N的猴子退出,最后剩下的猴子就是大王, 写出程序求出最后是大王的那只猴子最初的位置. 解题分析: 这道题很明显是约瑟夫问题,对于这样的问题,习惯的是对于每个做标记,然后改变标记. 代码: package cocalar; import java.util.Scanner; public class Monkey { public static void main(String[] args) { // TODO Auto-generat