标签:c++
一群猴子要选新猴王。新猴王的选择方法是:让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;
// }#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;
}标签:c++
原文地址:http://blog.csdn.net/u011545923/article/details/43835615