蛮力技术解决以下问题

时间:2020-06-14 06:47:00

标签: c++

给出一个整数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:我是新来的,所以如果我问错了请原谅我

1 个答案:

答案 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编译此代码。