约瑟夫环问题
这里才用的是vector来储存元素,每次删除元素时,消耗时间O(N),可才用环形链表来降低时间复杂度。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
// freopen("11.txt","r",stdin);
int n,m;
vector<int> vi;
while(cin>>n>>m)
{
vi.clear();
for(int i=0;i<2*n;i++)vi.push_back(i);
int index=0;//记录当前位置
for(int i=0;i<n;i++)//需要删除n个坏人
{
index=(index+m-1)%vi.size();
vi.erase(vi.begin()+index);//删除元素
}
int j=0;//vi下标,此时vi中都是好人
for(int i=0;i<2*n;i++)
{
if(i%50==0&&i!=0)
cout<<endl;
if(i==vi[j]&&j<vi.size())
{
j++;
cout<<"G";
}
else
{
cout<<"B";
}
}
cout<<endl<<endl;//格式要求多留一个空格
}
return 0;
}
n个人编号从1到n,每次报数到m就删除 ,求最后只剩下一个人的编号
#include<iostream>
#include<stdio.h>
#include<queue>
#include<map>
using namespace std;
//n个人编号从1到n,每次报数到m就删除 ,求最后只剩下一个人的编号
//时间复杂度 O(n)
int fun(int n,int m)
{
if(n==1)
return n;
else
return ( fun(n-1,m)+m-1)%n+1;
}
int main()
{
//freopen("11.txt","r",stdin);
int n,m;
cin>>n>>m;
cout<<fun(n,m);
return 0;
}