题解 | #删数#
删数
https://www.nowcoder.com/practice/f9533a71aada4f35867008be22be5b6e
#include <iostream>
#include <vector>
using namespace std;
/*以一个长度为三的向量为例,我们不妨把它初始化为[0,0,0],向量的元素值为0也就表示元素对应的下标(rank)没有被删掉,为-1即表示这个元素对应的下标已经被删掉*/
int lastrank(int n, vector<int>& vec) {
int rank;
int count = n - 1;//需要删掉n-1个元素
int j = 0;//报号计数,初始化为0
//循环遍历向量
while (count) {
for (int i = 0; i < n; ++i) {//遍历一轮向量
if (vec[i] == -1)continue;//跳过已删掉的元素
if (j == 2) {
vec[i] = -1;//删除
j = 0;//重新计数
count--;
}
else
++j;
}
}
//最后的元素
for (int i = 0; i < n; ++i)
if (vec[i] == 0) {
rank = i;
break;
}
return rank;
}
int main() {
int n;//总人数
while (cin >> n) {
vector<int> vec(n, 0);//全部初始化为0
cout << lastrank(n, vec) << endl;
}
return 0;
}
#include <vector>
using namespace std;
/*以一个长度为三的向量为例,我们不妨把它初始化为[0,0,0],向量的元素值为0也就表示元素对应的下标(rank)没有被删掉,为-1即表示这个元素对应的下标已经被删掉*/
int lastrank(int n, vector<int>& vec) {
int rank;
int count = n - 1;//需要删掉n-1个元素
int j = 0;//报号计数,初始化为0
//循环遍历向量
while (count) {
for (int i = 0; i < n; ++i) {//遍历一轮向量
if (vec[i] == -1)continue;//跳过已删掉的元素
if (j == 2) {
vec[i] = -1;//删除
j = 0;//重新计数
count--;
}
else
++j;
}
}
//最后的元素
for (int i = 0; i < n; ++i)
if (vec[i] == 0) {
rank = i;
break;
}
return rank;
}
int main() {
int n;//总人数
while (cin >> n) {
vector<int> vec(n, 0);//全部初始化为0
cout << lastrank(n, vec) << endl;
}
return 0;
}
