码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-15 16:37:36      阅读:576      评论:0      收藏:0      [点我收藏+]

标签:c++

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


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

标签:c++

原文地址:http://blog.csdn.net/u011545923/article/details/43835615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!