UVA 133 The Dole Queue(报数问题)
题意:一个长度为N的循环队列,一个人从1号开始逆时针开始数数,第K个出列,一个人从第N个人开始顺时针数数,第M个出列,选到的两个人要同时出列(以不影响另一个人数数),选到同一个人就那个人出列。
思路:用数组来操作,详情见代码吧。
- #include <iostream>
- #include <stdio.h>
- #include <string>
- /*
- 用数组存储序号,从左到右依次为1~n。
- 逆时针相当于从左往右依次数,大于n再从1开始,用right作为指针。
- 顺时针相当于从右往左依次数,小于1再从n开始,用left作为指针。
- */
- using namespace std;
- const int maxn=;
- int p[maxn]; //存储一开始的序列
- int n,k,m;
- int main()
- {
- while(scanf("%d%d%d",&n,&k,&m)!=EOF){
- if(n==&&k==&&m==)
- break;
- int first=;
- for(int i=;i<=n;i++)
- p[i]=i+;
- int left=n-,right=;
- do{
- //n为剩余人的个数,下面是计算此次被数到的人的位置
- right=(right+n+k-)%n;
- //从left开始往左数m个,相当于从left开始往右数n-(m-1)个
- left=((left+n-(m-))%n+n)%n; //注意这里很有可能会出现负数,所以加n再模一次
- if(left==right){
- if(first)
- printf("%3d",p[left]);
- else
- printf(",%3d",p[left]);
- first=;
- for(int i=left;i<n;i++)
- p[i]=p[i+];
- //因为left是往左移的,后面的数往左移动,指针也要往左移动,使left指向出列的那个人的前一个人
- //而由于right是往右数的,后面的数往左移动,right自动指向后一个(即出列的那个人的后一个),所以不需要变动
- left--;
- if(left< && n>)
- left=(left+n-)%(n-);
- n--;
- }
- else{
- if(first)
- printf("%3d%3d",p[right],p[left]);
- else
- printf(",%3d%3d",p[right],p[left]);
- first=;
- //left指针在right之前
- if(left<right){
- for(int i=right;i<n;i++)
- p[i]=p[i+];
- for(int i=left;i<n-;i++)
- p[i]=p[i+];
- /*
- right后面的数都往左移动1次
- left后面的数都往左移动2次,
- 由于right指针是往右移动的,所以为了指向出列的人的后一个,right要减1
- left指针则是往左移动的,这里要往左移动1格,指向出列的人的前一个。
- */
- right--;
- if(right< && n>)
- right=(right+n-)%(n-);
- left--;
- if(left< && n>)
- left=(left+n-)%(n-);
- }
- //left指针在right之后
- else{
- for(int i=left;i<n;i++)
- p[i]=p[i+];
- for(int i=right;i<n-;i++)
- p[i]=p[i+];
- /*left指针后面的数都往左移动1次
- right指针后面的数都往左移动2次,
- 由于right指针是往右移动的,当后面的数往左移动,right自动指向出列的人的后一个,所以不需要变动。
- left指针则是往左移动的,这里要往左移动2格,指向出列的人的前一个。
- */
- left-=;
- if(left< && n>)
- left=(left+n-)%(n-);
- }
- n-=;
- }
- }while(n);
- printf("\n");
- }
- return ;
- }
UVA 133 The Dole Queue(报数问题)的更多相关文章
- UVA 133 The Dole Queue
The Dole Queue 题解: 这里写一个走多少步,返回位置的函数真的很重要,并且,把顺时针和逆时针写到了一起,也真的很厉害,需要学习 代码: #include<stdio.h> # ...
- UVA 133“The Dole Queue”(循环报数处理技巧)
•参考资料 [1]:紫书P82 •题意(by紫书) 按照被选中的次序输出这 n 个人的编号: 如果A和B选中的是同一个人,输出一个这个人的编号: 输出格式:输出的每个编号占3个字节,不够3个字节在前面 ...
- uva 133 The Dole Queue 双向约瑟夫环 模拟实现
双向约瑟夫环. 数据规模只有20,模拟掉了.(其实公式我还是不太会推,有空得看看) 值得注意的是两个方向找值不是找到一个去掉一个,而是找到后同时去掉. 还有输出也很坑爹! 在这里不得不抱怨下Uva的o ...
- uva - 133 The Dole Queue(成环状态下的循环走步方法)
类型:循环走步 #include <iostream> #include <sstream> #include <cstdio> #include <cstr ...
- uva 133(The Dole Queue UVA - 133)
一道比较难想的模拟题,用了队列等东西,发现还是挺难做的,索性直接看了刘汝佳的代码,发现还是刘汝佳厉害! 代码本身难度并不是很大,主要还是p=(p+n+d-1)%n+1;这一句有些难度,实际上经过自己的 ...
- uvaoj 133 - The Dole Queue(逻辑,环形队列数数)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa133.The Dole Queue
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- The Dole Queue UVA - 133
In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros ...
- The Dole Queue
The Dole Queue Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit cid ...
随机推荐
- 解析XML文档之二:使用PULL解析
第一步:解析文档为一下文档 <?xml version="1.0" encoding="UTF-8"?> <students> < ...
- linux中的namespace
本文将就namespace这个知识点,进行简单的归纳总结,力求通俗易通.在资料汇总的过程中,参考了许多网上的博客资料,在文章尾部给出相关链接. namespace,命名空间,从名字 ...
- Linux 线程 条件变量
一:条件变量 直接上最基本的两个函数,先抓主要矛盾: //等待条件 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex ...
- 从零开始搭建TestCpp工程
目标: 创建一个测试工程,测试工程以列表的方式展示,没一个列表项对应一个场景 1. 创建cocos2d-x工程 现在采用脚本的方式来创建,好处是一次可以创建N个项目的工程. 首先 ...
- 常用HTML meta 标签属性(网站兼容与优化需要),meta标签
常用HTML meta 标签属性(网站兼容与优化需要),meta标签 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索 ...
- js中隐式类型转换测试
javascript数据类型: 使用typeof可以返回的数据类型有六种 "number" , "string" , "boolean" ...
- i18next-页面层语言国际化js框架介绍
因为工作需要,最近研究了下网站语言国际化的问题,根据当前项目架构,寻求一种较好的解决方案.首先总结下项目中语言切换实现方式大概有以下几种: 1,一种语言一套页面,如:index_CN.html,ind ...
- Java IO流详尽解析
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- JAVA四种线程池实例
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java 1 2 3 4 5 6 7 new Thread(new Runnable() { ...
- 【Delphi】最小化事件捕捉
添加一个ApplicationEvents组件在窗体,然后处理其OnMinimize事件和OnRestore事件即可.