11. 猴子选大王(20)

一群猴子要选新猴王。新猴王的选择方法是:让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,3auto it = num.begin();while (num.size() > 1){++flag;if (flag == 3){it = num.erase(it); //注意删除后it就无效了,不能再去++!!!//erase会返回被删除元素下一个的指针flag = 0;}if (flag != 0)//一开始这里弄错,由于删除时的保存操作,导致若删除了的话自动会移动到下一个的++it; //next iterif (it == num.end()){it = num.begin();}}cout << *num.begin() << endl;return 0;}

,海内存知已,天涯若比邻。

11. 猴子选大王(20)

相关文章:

你感兴趣的文章:

标签云: