大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。
约瑟夫问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描写叙述
n个人进行编号,分别从1到n,排成一个圈,顺时针从1開始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
输入
输出
演示样例输入
5 3
演示样例输出
4
首先说一下写这个之前我是准备徒手艹链表的,可惜意志力实在不咋滴,再加上手头上没课本,之前我有看过C语言版的链表实现,但没动手敲过,都是偷懒用list水过,list是双向链表,但约瑟夫这个问题吧,明显是用循环链表来完毕的,问题来了,本渣不会艹链表啊,木办法仅仅能用list来胡搞了
#include <stdio.h> #include <iostream> #include <algorithm> #include <list> using namespace std; int main() { int m,n,i; cin>>n>>m; list <int> node; list <int>::iterator j; for(i=1;i<=n;i++) node.push_back(i); //编号 j=node.begin(); while(node.size()>1) //当链表中仅仅剩一个元素时结束 { for(i=1;i<m;i++) //第k遍遍历 { if(j!=node.end()) j++; else //重点来了 { j=node.begin(); j++; //一開始忘记写这个了 事实上当j=node.end()时就意味着j已经指向node.begin()了,仅仅是由于这不是循环链表,我们须要手动把它改过来 } } if(j!=node.end()) node.erase(j++); else //同上 { j=node.begin(); node.erase(j++); } } cout<<node.front()<<endl; return 0; }
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118021.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...