题目:对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入描述:
每组数据一行一个数字,为题目中的n(n小于等于1000)。
输出描述:
一行输出最后剩下的数字。
输入例子:
500
输出例子:
255
解答:
直接用链表模拟了
1 #include <iostream> 2 #include <list> 3 4 using namespace std; 5 6 int calcLastN(int n) { 7 list<int> l1; 8 for (size_t i = 0; i < n+1; i++) 9 { 10 l1.push_back(i); 11 } 12 while (l1.size() != 1) 13 { 14 list<int> l2; 15 while (l1.size() > 1) 16 { 17 l1.pop_front(); 18 if (l1.size() < 1) break; 19 l2.push_back(l1.front()); 20 l1.pop_front(); 21 } 22 l1 = l2; 23 } 24 return l1.front(); 25 } 26 int main() { 27 int n; 28 while (cin >> n) 29 { 30 cout << ((n <= 0) ? 0 : calcLastN(n))<< endl; 31 } 32 }