每日编程-20170328

题目:对于一个由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 }

 

posted @ 2017-03-28 16:57  r088r088  阅读(95)  评论(0编辑  收藏  举报