题目描述:
有一个数组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; }