问题描述:
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,求最后一个出列人的编号。
该问题可以用数组或者循环链表模拟,因为都是直接模拟,需要循环n次,每次数m次,所以时间复杂度都是O(n*m)。虽然复杂度比O(n)大,但是可以求出出圈的编号顺序。也正是因为该方法将每次出圈的人都找了出来,所以做了很多无用操作,复杂度才会高达O(n*m)。
下面是数组和链表方法的代码:
题意:n个人,从第k个人开始数1,数到m的人剔除,输出剔除的顺序。
#include <iostream>
#include<cstdio>
#include<ctime>
#include<algorithm>
#include<cstdlib>
using namespace std;
#define MAXN 10000
int a[MAXN];
int N,k,m;
bool InCircle[MAXN];
typedef struct _node{
struct _node* prev;
struct _node* next;
int number;
}node;
node* MakeDLL(int n){
node *head = new node;/*Memory allocated to the head node*/
node *tail;
int i;
head->next = head;
head->prev = head;
head->number = 1;
tail =