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