首页 > 其他分享 >约瑟夫问题(洛谷P1996)

约瑟夫问题(洛谷P1996)

时间:2023-01-18 23:14:01浏览次数:36  
标签:node head 洛谷 int 约瑟夫 链表 next P1996 now

问题描述:

有n个人,编号为1~n,按顺序围成一圈,从第一个人开始报数,到第m个人出列,再由下一个人重新从1开始报数,数到m再出列,直到所有人都出列,依次输出所有出列的人的编号。
输入:两个整数n,m,1<=m,n<=100
输出:n个整数,按顺序输出编号

动态链表

点击查看代码
#include <bits/stdc++.h>
struct node{
	int data;
	node* next;
};

int main(){
	int n,m; scanf("%d %d", &n, &m);
	node* head, *now, *p, *prev;
	head = new node; head->data=1; head->next=NULL;
	now = head;
	for(int i=2;i<=n;i++){
		p = new node; p->data=i; p->next=NULL;
		now->next = p;
		now = p;
	}
	now->next = head;
	now = head;
	while((n--)>1){
		for(int i=1;i<m;i++){
			prev = now;
			now = now->next;
		}
		printf("%d ", now->data);
		prev->next = now->next;
		delete now;
		now = prev->next;
	}
	printf("%d", now->data);
	delete now;
	return 0;
}

静态链表

用结构体实现单向静态链表

点击查看代码
#define N 100
#include <bits/stdc++.h>
struct node{
	int id, nextid;
}nodes[N];

int main(){
	int n,m; scanf("%d %d", &n,&m);
	for(int i=1;i<=n;i++){
		nodes[i].id=i;
		nodes[i].nextid=i+1;
	}
	nodes[n].nextid = 1;
	int now = 1, prev=1;
	while((n--)>1){
		for(int i=1;i<m;i++){
			prev=now;
			now=nodes[now].nextid;
		}
		printf("%d ", nodes[now].id);
		nodes[prev].nextid = nodes[now].nextid;
		now=nodes[prev].nextid;
	}
	printf("%d", nodes[now].id);
	return 0;
}

用结构体实现双向静态链表

点击查看代码
#define N 100
#include <bits/stdc++.h>
struct node{
	int id;
	int previd, nextid;
}nodes[N];

int main(){
	int n,m; scanf("%d %d", &n,&m);
	for(int i=1;i<=n;i++){
		nodes[i].id=i;
		nodes[i].previd=i-1;
		nodes[i].nextid=i+1;
	}
	nodes[n].nextid = 1;
	nodes[1].previd = n;
	int now = 1;
	while((n--)>1){
		for(int i=1;i<m;i++){
			now = nodes[now].nextid;
		}
		printf("%d ", nodes[now].id);
		nodes[nodes[now].previd]=nodes[now].nextid;
		nodes[nodes[now].nextid]=nodes[now].previd;
		now = nodes[now].nextid;
	}
	printf("%d", nodes[now].id);
	return 0;
}

用一维数组实现静态链表

点击查看代码
#include <bits/stdc++.h>
int nodes[101];
int main(){
	for(int i=1;i<=n-1;i++){
		nodes[i]=i+1;
	}
	nodes[n]=1;
	int now=1, prev=1;
	while((n--)>1){
		for(int i=1;i<m;i++){
			prev=now;
			now = nodes[now];
		}
		printf("%d ", now);
		nodes[prev] = nodes[now];
		now = nodes[prev];
	}
	printf("%d", now);
	return 0;
}


STL list

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main(){
	int n,m; cin>>n>>m;
	list<int> node;
	for(int i=1;i<=n;i++){node.emplace_back(i);}
	list<int>::iterator it = node.begin();
	while(node.size()>1){
		for(int i=1;i<m;i++){
			it++;
			if(it==node.end()){ it = node.begin(); }
		}
		cout<<*it<<" ";
		list<int>::iterator next = ++it;
		if(next==node.end()) next=node.begin();
		node.erase(--it);
		it = next;
		/*
		erase后,当前的iter会失效,要么新建一个iterator来保存下一个iter如上面
		要么在erase时保留当前iter的自增值
		it++的情况下,it本身已经指向下一个有效的iter
		node.erase(it++);	
		if(it==node.end()) it=node.begin();
		*/
	}
	cout<<*it;
	return 0;
}

标签:node,head,洛谷,int,约瑟夫,链表,next,P1996,now
From: https://www.cnblogs.com/YingHN/p/17060695.html

相关文章

  • 我的洛谷成就
    我的成就AC之神成就一战成名成就红题收割者橙题收割者黄题收割者绿蓝收割者紫黑收割者强人之友领奖之王贡献标兵全勤标兵......
  • 洛谷普及组模拟赛 题解报告
    洛谷普及组模拟赛题解报告\[\bf{Prepared\by\InoueTakina.}\]前言:祝大家身体健康。本场比赛较为良心,经过了多次难度平衡,应该严格低于NOIP2018提高组,相信大家......
  • 洛谷 P2241 统计方形
    原题链接题解记住遍历时求i*j乘积的和就是该区域内矩形的个数遍历时求i,j最小值的和就是该区域内正方形的个数所以所有矩形的个数减去正方形的个数就是长方形个数#i......
  • 洛谷 P3392 涂国旗
    原题链接题解首先用一个二维数组记录每行中WBR的数量,用来提高查找速度其次就是用两层for循环进行区域划分,如下图所示然后对区域内的所需更改颜色进行统计,这里要注意......
  • 洛谷P3195 玩具装箱 题解报告
    题目地址题意:如题所述。分析:斜率优化dp模板题。题目没看清就下手,自以为题面所述中i>j;原始dp式子也没设计准确。中途在错误方向上头铁时,甚至没注意到横坐标是沿......
  • 洛谷P3628 特别行动队 题解报告
    题目地址题意:把正整数序列分隔为若干区间,若单个区间的元素之和为X,则其贡献为\(aX^2+bX+c\)。求所有区间的贡献之和的最大值。分析:斜率优化dp模板题。这篇博客描述得......
  • 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
    洛谷链接牛客链接两个平台都过了题目:题解:本题是一道比较硬核的模拟题,思路方面其实问题不大,但是难在模拟情况上面而且测试数据里还包含了一些题目中没有提到的情况,所......
  • 洛谷P1496 火烧赤壁【题解】
    事先声明本题解文字比较多,较为详细,算法为离散化和差分,如会的大佬可以移步去别处看这道题的思路(因为作者比较懒,不想新开两个专题)。题目简要给定每个起火部分的起点和终点......
  • 洛谷 P1036 选数
    原题链接题解:#include"iostream"#include"algorithm"#definelllonglongusingnamespacestd;llsum=0;boolprime(llx){intn=2;for(;x%n!=0;n++)......
  • 洛谷P1157 组合的输出
    原题链接题解:本题有两种办法解决,第一种使用stl中next_permutation函数#include"iostream"#include"algorithm"#include"iomanip"usingnamespacestd;intmai......