题意:一个长度为N的循环队列,一个人从1号开始逆时针开始数数,第K个出列,一个人从第N个人开始顺时针数数,第M个出列,选到的两个人要同时出列(以不影响另一个人数数),选到同一个人就那个人出列。

思路:用数组来操作,详情见代码吧。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4.  
  5. /*
  6. 用数组存储序号,从左到右依次为1~n。
  7. 逆时针相当于从左往右依次数,大于n再从1开始,用right作为指针。
  8. 顺时针相当于从右往左依次数,小于1再从n开始,用left作为指针。
  9. */
  10. using namespace std;
  11. const int maxn=;
  12. int p[maxn]; //存储一开始的序列
  13. int n,k,m;
  14.  
  15. int main()
  16. {
  17. while(scanf("%d%d%d",&n,&k,&m)!=EOF){
  18. if(n==&&k==&&m==)
  19. break;
  20. int first=;
  21. for(int i=;i<=n;i++)
  22. p[i]=i+;
  23. int left=n-,right=;
  24. do{
  25. //n为剩余人的个数,下面是计算此次被数到的人的位置
  26. right=(right+n+k-)%n;
  27. //从left开始往左数m个,相当于从left开始往右数n-(m-1)个
  28. left=((left+n-(m-))%n+n)%n; //注意这里很有可能会出现负数,所以加n再模一次
  29. if(left==right){
  30. if(first)
  31. printf("%3d",p[left]);
  32. else
  33. printf(",%3d",p[left]);
  34. first=;
  35. for(int i=left;i<n;i++)
  36. p[i]=p[i+];
  37. //因为left是往左移的,后面的数往左移动,指针也要往左移动,使left指向出列的那个人的前一个人
  38. //而由于right是往右数的,后面的数往左移动,right自动指向后一个(即出列的那个人的后一个),所以不需要变动
  39. left--;
  40. if(left< && n>)
  41. left=(left+n-)%(n-);
  42. n--;
  43. }
  44. else{
  45. if(first)
  46. printf("%3d%3d",p[right],p[left]);
  47. else
  48. printf(",%3d%3d",p[right],p[left]);
  49. first=;
  50. //left指针在right之前
  51. if(left<right){
  52. for(int i=right;i<n;i++)
  53. p[i]=p[i+];
  54. for(int i=left;i<n-;i++)
  55. p[i]=p[i+];
  56. /*
  57. right后面的数都往左移动1次
  58. left后面的数都往左移动2次,
  59. 由于right指针是往右移动的,所以为了指向出列的人的后一个,right要减1
  60. left指针则是往左移动的,这里要往左移动1格,指向出列的人的前一个。
  61. */
  62. right--;
  63. if(right< && n>)
  64. right=(right+n-)%(n-);
  65. left--;
  66. if(left< && n>)
  67. left=(left+n-)%(n-);
  68. }
  69. //left指针在right之后
  70. else{
  71. for(int i=left;i<n;i++)
  72. p[i]=p[i+];
  73. for(int i=right;i<n-;i++)
  74. p[i]=p[i+];
  75. /*left指针后面的数都往左移动1次
  76. right指针后面的数都往左移动2次,
  77. 由于right指针是往右移动的,当后面的数往左移动,right自动指向出列的人的后一个,所以不需要变动。
  78. left指针则是往左移动的,这里要往左移动2格,指向出列的人的前一个。
  79. */
  80. left-=;
  81. if(left< && n>)
  82. left=(left+n-)%(n-);
  83. }
  84. n-=;
  85. }
  86. }while(n);
  87. printf("\n");
  88. }
  89. return ;
  90. }

UVA 133 The Dole Queue(报数问题)的更多相关文章

  1. UVA 133 The Dole Queue

    The Dole Queue 题解: 这里写一个走多少步,返回位置的函数真的很重要,并且,把顺时针和逆时针写到了一起,也真的很厉害,需要学习 代码: #include<stdio.h> # ...

  2. UVA 133“The Dole Queue”(循环报数处理技巧)

    •参考资料 [1]:紫书P82 •题意(by紫书) 按照被选中的次序输出这 n 个人的编号: 如果A和B选中的是同一个人,输出一个这个人的编号: 输出格式:输出的每个编号占3个字节,不够3个字节在前面 ...

  3. uva 133 The Dole Queue 双向约瑟夫环 模拟实现

    双向约瑟夫环. 数据规模只有20,模拟掉了.(其实公式我还是不太会推,有空得看看) 值得注意的是两个方向找值不是找到一个去掉一个,而是找到后同时去掉. 还有输出也很坑爹! 在这里不得不抱怨下Uva的o ...

  4. uva - 133 The Dole Queue(成环状态下的循环走步方法)

    类型:循环走步 #include <iostream> #include <sstream> #include <cstdio> #include <cstr ...

  5. uva 133(The Dole Queue UVA - 133)

    一道比较难想的模拟题,用了队列等东西,发现还是挺难做的,索性直接看了刘汝佳的代码,发现还是刘汝佳厉害! 代码本身难度并不是很大,主要还是p=(p+n+d-1)%n+1;这一句有些难度,实际上经过自己的 ...

  6. uvaoj 133 - The Dole Queue(逻辑,环形队列数数)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. UVa133.The Dole Queue

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. The Dole Queue UVA - 133

     In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros ...

  9. The Dole Queue

    The Dole Queue Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit cid ...

随机推荐

  1. 解析XML文档之二:使用PULL解析

    第一步:解析文档为一下文档 <?xml version="1.0" encoding="UTF-8"?> <students> < ...

  2. linux中的namespace

         本文将就namespace这个知识点,进行简单的归纳总结,力求通俗易通.在资料汇总的过程中,参考了许多网上的博客资料,在文章尾部给出相关链接.      namespace,命名空间,从名字 ...

  3. Linux 线程 条件变量

    一:条件变量 直接上最基本的两个函数,先抓主要矛盾: //等待条件 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex ...

  4. 从零开始搭建TestCpp工程

    目标: 创建一个测试工程,测试工程以列表的方式展示,没一个列表项对应一个场景 1. 创建cocos2d-x工程       现在采用脚本的方式来创建,好处是一次可以创建N个项目的工程.      首先 ...

  5. 常用HTML meta 标签属性(网站兼容与优化需要),meta标签

    常用HTML meta 标签属性(网站兼容与优化需要),meta标签 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索 ...

  6. js中隐式类型转换测试

    javascript数据类型: 使用typeof可以返回的数据类型有六种 "number" , "string" ,  "boolean" ...

  7. i18next-页面层语言国际化js框架介绍

    因为工作需要,最近研究了下网站语言国际化的问题,根据当前项目架构,寻求一种较好的解决方案.首先总结下项目中语言切换实现方式大概有以下几种: 1,一种语言一套页面,如:index_CN.html,ind ...

  8. Java IO流详尽解析

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. JAVA四种线程池实例

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗?   Java   1 2 3 4 5 6 7 new Thread(new Runnable() {        ...

  10. 【Delphi】最小化事件捕捉

    添加一个ApplicationEvents组件在窗体,然后处理其OnMinimize事件和OnRestore事件即可.