(1)有一个数组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(删除),如此循环直到最后一个数被删除。
分析:(1)队列实现
(2)(网上看到的)//递推公式:f[1] = 0 ,f[n] = (f[n - 1] + K) mod n 约瑟夫问题
程序:
#include<bits/stdc++.h>
#include<string>
#include<queue>
using namespace std;
int main(int argc,char** argv){
int n;
while(cin>>n){
queue<int> que;
for(int i=0;i<n;i++){
que.push(i);
}
int count=0;
while(que.size()!=1){
if(count==2){
que.pop();
count=0;
}else{
int a=que.front();
que.pop();
que.push(a);
count++;
}
// cout<<que.front()<<" "<<endl;
}
// cout<<que.front();
int temp=que.front();
cout<<temp<<endl;
}
return 0;
}
(2)
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。