数组-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;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。