題目描述:
對於一個由0…n的所有數按升序組成的序列,我們要進行一些篩選,每次我們取當前所有數字中從小到大的第奇數位個的數,並將其丟棄。重複這一過程直到最後剩下一個數。請求出最後剩下的數字。
解題思想:
分爲兩種情況:
情況1:n=0時
直接輸出0;
情況2:n>0時
step1:每一輪遍歷,找出需要丟棄的奇數位,然後將奇數位值設爲-1;
step2:刪除值爲-1的位。
#include <iostream>
#include <vector>
using namespace std;
//每輪被丟棄設爲-1
vector<int> set_drop(vector<int> num){
int length = num.size();
for(int i = 1; i <= length; ++i){
if((i % 2) != 0){
num[i-1] = -1;
}
}
return num;
}
int main(){
int n;
while(cin >> n){
//特殊情況
if(n == 0)
cout << 0 << endl;
vector<int> vec;
for(int i = 0; i <= n; ++i){
vec.push_back(i);
}
while(vec.size() > 1){
vec = set_drop(vec);
for(int i = 0; i < vec.size(); ++i){
if(vec[i] == -1){
vec.erase(vec.begin() + i);
i--;//每一次刪除,vec.size()都會動態較少,索引也會回退,因此需要i--
}
}
}
cout << vec[0] << endl;
}
return 0;
}