给出一个整数A,该整数表示排队的人数。 选择过程遵循以下规则:选择站立在均匀位置上的人。在所选择的人员中形成队列,并再次从这些仅处于偶数位置的人员中选择人员。 这一直持续到我们只剩下一个人为止。查找并返回该人在原始队列中的位置。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int A=10,p=0,i;
vector<bool> mark(A+1,true);
mark[0]=false;
for(i=0;i<=A;i=i+2)
{
p++;
if(p==2)
{
mark[i]=false;
p=0;
}
}
for(int j=0;j<A;j++)
{
cout<<mark[j];
}
for(i=0;i<A;i++)
{
if(mark[i]==true)
{
cout<<i<<endl;
}
}
}
我尝试过此方法,但仅适用于第一组偶数 ps:我是新来的,所以如果我问错了请原谅我
答案 0 :(得分:2)
如果您对类似于您的简单算法感兴趣,请参见以下示例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int A = 10, currentSize = A;
vector<bool> mark(A, true);
while (currentSize > 1) {
for (int i = 0, j = 1; i < A; i++) {
if (mark[i]) {
if (j % 2 != 0) {
mark[i] = false;
currentSize--;
}
j++;
}
}
}
for (int i = 0; i < A; i++) {
if (mark[i]) {
cout << i + 1 << endl;
break;
}
}
return 0;
}
如果您只需要使用更快的算法来解决问题,那么我认为这是正确的:
#include <iostream>
using namespace std;
int main()
{
int A = 10, p = 0;
while (A / 2 != 0) {
A /= 2;
p++;
}
cout << pow(2, p);
return 0;
}
我使用VS2017编译此代码。