删数

题目描述:

有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

算法:队列。我们可以维护一个队列,并用一个计数器。每当计数器不等于2时,我们不断的将队头的数放到队尾。当计数器为2时,我们删除队头元素。直到

整个过程下来队列中的元素数量为1时为止。

此题虽简单,但是利用队列的思想,可以解决这一类所有的问题(约瑟夫环,幸存者游戏等)

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int main(void){
    queue<int>q;
    int n,cnt=0;
    cin>>n;
    for(int i=0;i<n;i++)q.push(i);
    while(q.size()!=1){
        if(cnt!=2){
            int b=q.front();
            q.pop();
            q.push(b);
            cnt++;
        }
        else{
            cnt=0;
            q.pop();
        }
    }
    cout<<q.front()<<endl;
    return 0;
}

 

posted @ 2019-07-08 19:33  YF-1994  阅读(123)  评论(0编辑  收藏  举报