约瑟夫环问题的几种解法

简介: 约瑟夫环问题的几种解法
int mind01()
{
  vector<int> vec;
  int n, m;
  scanf("%d%d",&n,&m);
  //初始化
  for (int i=1;i<=n;i++)
  {
    vec.push_back(i);
  }
  //开始游戏
  int vz = 0;
  while (vec.size() > 1)    //留下最后一个人
  {
    //约瑟夫环经典公式-->循环队列
    vz = (vz + m - 1) % vec.size(); //因为下表从0开始的,所以减一
    //淘汰的那个人
    cout << vec[vz] << endl;
    vec.erase(vec.begin()+vz);
  }
  //淘汰掉最后一个人
  cout << vec[0] << endl;
  return 0;
}
int mind02()
{
  queue<int> que;
  int n, m;
  int count_num = 1;    //计数
  scanf("%d%d",&n,&m);
  //初始化
  for (int i=1;i<=n;i++)
  {
    que.push(i);
  }
  //开始游戏-->循环队列
  while (!que.empty())   //当队列不为空
  {
    if (count_num == m)   //有人要被淘汰掉了
    {
      cout << que.front() <<" ";
      que.pop();        //把被淘汰的人从队列中剔除出去
      count_num = 1;      //下一个人要重新从1开始
    }
    else //这个人不会被淘汰掉
    {
      count_num++;
      que.push(que.front());    //把队头的人当到队尾
      que.pop();
    }
  }
  return 0;
}
struct node
{
  int date;
  node *next;
}*head , *tail;     //循环链表的头尾结点
void initList(int len)
{
  //辅助指针
  node* s;
  //建立头节点
  head = new node;
  tail = head;
  head->next = NULL;
  //初始化-->尾插法
  for (int i=1;i<=len;i++)
  {
    s = new node;
    s->date = i;
    tail->next = s;
    tail = s;
  }
  tail->next = head->next;    //循环链表
}
void del_node(node * &cur,node * &pro)
{
  node *s = cur;
  pro->next = cur->next;
  cur = cur->next;
  delete s;
  s = NULL;
}
int mind03()
{
  int n, m;
  int count_num = 1;    //计数
  node *cur = NULL;
  node *pro = NULL;
  scanf("%d%d",&n,&m);
  initList(n);
  cur = head->next;
  cur = head->next;
  pro = head;
  这里我们不妨先把头节点删掉
  while (pro->next != pro)      //只剩下最后一个人了
  {
    //cout << "aaaa" << endl;
    if (count_num == m)     //踢人咯
    {
      count_num = 1;
      cout << cur->date << " ";
      del_node(cur,pro);
    }
    else
    {
      count_num++;
      cur = cur->next;
      pro = pro->next;
    }
  }
  //
  if (pro != NULL)
  {
    //cout << "aaaa" << endl;
    cout << pro->date << endl;
    delete pro;
    pro = NULL;
    cur = NULL;
  }
  if (head != NULL)
    delete head;
  return 0;
}
//线段树-->可以直接百度查找模板直接使用即可 O(lbn)
/*
线段树是一种二叉搜索树,与区间树相似,
它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。
对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],
右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。
使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。
而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩。
线段树至少支持下列操作:
Insert(t,x):将包含在区间 int 的元素 x 插入到树t中;
Delete(t,x):从线段树 t 中删除元素 x;
Search(t,x):返回一个指向树 t 中元素 x 的指针。
*/
相关文章
|
弹性计算 运维 监控
GPU实例使用--vGPU驱动自动安装和升级
为了适配最新的渲染软件,以及驱动稳定性的提升,vGPU实例的驱动需要定期进行升级,因为使用vgpu的客户多数为渲染和云游戏等业务场景,对vGPU驱动的快速升级和批量自动化要求比较高。
GPU实例使用--vGPU驱动自动安装和升级
IDEA 利用groovy脚本生成注释
【10月更文挑战第29天】在 IntelliJ IDEA 中,可以通过创建和运行 Groovy 脚本来自动生成 Java 类方法的 Javadoc 注释。首先,创建一个 Groovy 文件并编写脚本,该脚本会检查每个方法是否已有注释,如果没有,则生成包含方法描述、参数列表和返回值的基本注释。接着,通过“Tools”菜单下的“Groovy Console”运行脚本,确保脚本中的包版本与当前使用的 IntelliJ IDEA 版本匹配。运行后,脚本将自动为选定类的方法添加注释。建议在执行前备份代码,以防意外。
453 2
|
人工智能 算法 数据中心
从“纸面算力”到“好用算力”,超聚变打通AI+“最后一公里”
2024年,《政府工作报告》首提“AI+”行动,推动人工智能成为新质生产力引擎。市场层面,AI+正深刻变革金融、医疗、制造等行业,但AI算力瓶颈依然存在。在2024年中国算力大会上,超聚变等企业探讨了算力的绿色化和效能提升。超聚变推出的FusionPoD for AI全液冷服务器,显著降低能耗并提升算力效能,其FusionOne AI解决方案也加速了AI在各行业的落地。这些创新将重塑算力格局,推动智能革命。
289 0
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
leetcode-695:岛屿的最大面积
leetcode-695:岛屿的最大面积
116 0
|
Go Python
Go Web 编程入门:Go pongo2 模板引擎(上)
模板引擎是一个库,旨在将模板与数据结合起来以生成文档。模板引擎用于生成大量电子邮件、源代码预处理或生成动态 HTML 页面。
Go Web 编程入门:Go pongo2 模板引擎(上)
|
机器学习/深度学习 人工智能 算法
机器学习连载(32)
机器学习连载(32)
75 0
机器学习连载(32)
|
监控 数据库
CANape的使用教程
CANape的使用教程
CANape的使用教程
|
SQL 监控 关系型数据库
MySQL慢查询及解决方案
对于生产业务系统来说,慢查询也是一种故障和风险,一旦出现故障将会造成系统不可用影响到生产业务。当有大量慢查询并且SQL执行得越慢,消耗的CPU资源或IO资源也会越大,因此,要解决和避免这类故障,关注慢查询本身是关键。
722 0
MySQL慢查询及解决方案
|
机器学习/深度学习 自然语言处理 算法
CVPR 2022 | 大幅减少零样本学习所需的人工标注,马普所和北邮提出富含视觉信息的类别语义嵌入
CVPR 2022 | 大幅减少零样本学习所需的人工标注,马普所和北邮提出富含视觉信息的类别语义嵌入
294 0