题意:一个长度为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(报数问题)的更多相关文章

  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. Java序列化与反序列化(Serializable)

    Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...

  2. Java 字符流实现文件读写操作(FileReader-FileWriter)

    Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...

  3. C++ 实现不能被继承的类

    方法一: #include <iostream> using namespace std; class A { public: static A* getInstance(); stati ...

  4. spring4.0源码导入

    一个面试,让我知道了自己的不足,一天不进步就是倒退. spring源码导入eclipse 本人的环境 (我导入的是最新的spring 4.0 所以要用jdk1.8) 1 安装git (mac上自带了g ...

  5. 打造自己的3D全景漫游

    three.js 示例: ​ 打造H5里的"3D全景漫游"秘籍 - 腾讯ISUX ​ QQ物联星球计划 通过pano2vr直接将鱼眼全景图生成立体空间的六个面:也可通过Photos ...

  6. 设置datagridview中button按钮的背景颜色

    问题:DataGridViewButtonColumn()在datagridview中创建按钮列,如何设置按钮的背景颜色(不是单元格的背景颜色). 回答:可以在dataGridView1_CellPa ...

  7. php strpos 用法实例教程

    定义和用法该strpos ( )函数返回的立场,首次出现了一系列内部其他字串. 如果字符串是没有发现,此功能返回FALSE . 语法 strpos(string,find,start) Paramet ...

  8. Python标准库之urllib,urllib2自定义Opener

    urllib2.urlopen()函数不支持验证.cookie或者其它HTTP高级功能.要支持这些功能,必须使用build_opener()函数创建自定义Opener对象. 1. build_open ...

  9. 爱重启的windows,伤不起

    .

  10. Error:/etc/fstab:Read-only file system错误的解决办法

    1.挂载60T存储,设置开机自动挂载,UUID编号配置错误导致系统无法启动 2.根据提示进入维护状态,输入root密码,进入fstab删除UUID等内容,结果报错     Error:/etc/fst ...