The Dole Queue UVA - 133
In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros Party has decided on the following strategy. Every day all dole applicants will be placed in a large circle, facing inwards. Someone is arbitrarily chosen as number 1, and the rest are numbered counterclockwise up to N (who will be standing on 1’s left). Starting from 1 and moving counter-clockwise, one labour official counts off k applicants, while another official starts from N and moves clockwise, counting m applicants. The two who are chosen are then sent off for retraining; if both officials pick the same person she (he) is sent off to become a politician. Each official then starts counting again at the next available person and the process continues until no-one is left. Note that the two victims (sorry, trainees) leave the ring simultaneously, so it is possible for one official to count a person already selected by the other official.
Input
Write a program that will successively read in (in that order) the three numbers (N, k and m; k, m > 0, 0 < N < 20) and determine the order in which the applicants are sent off for retraining. Each set of three numbers will be on a separate line and the end of data will be signalled by three zeroes (0 0 0).
Output
For each triplet, output a single line of numbers specifying the order in which people are chosen. Each number should be in a field of 3 characters. For pairs of numbers list the person chosen by the counterclockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a trailing comma).
Note: The symbol ⊔ in the Sample Output below represents a space.
Sample Input
10 4 3
0 0 0
Sample Output
⊔ ⊔ 4⊔ ⊔ ⊔ ,⊔ ⊔ 9⊔ ⊔ 5,⊔ ⊔ 3⊔ ⊔ 1,⊔ ⊔ 2⊔ ⊔ 6,⊔ ⊔ 10,⊔ ⊔ 7
HINT
这个题目采用的思路并不复杂,只需要两个简单的函数,一个检测循环终止条件。另一个是对每一个官员调寻得结果来计算的函数,需要区分的是第一次输入和其他次输入的区别,键入以返回值作为下一次的参数,那么除了第一次的参数外都是上一次的结果是已经判断过的,而第一次去不同。具体区分方法看代码。
Accepted
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int exam(int arr[], int n)
{
for (int i = 1;i <= n;i++)
if (!arr[i])return 1;
return 0;
}
int go(int arr[], int n, int k,int v, int flag)
{
int i = 1;
while (i <= k)
{
if (flag == 1 && v == n) v = 1;
else if (flag == -1 && v == 1)v = n;
else v += flag;
if (!arr[v]&&v!=0&&v!=n+1) i++;
}
return v;
}
int main()
{
int n, k, m;
while (scanf("%d%d%d",&n,&k,&m)!=EOF&&n&&k&&m)
{
int arr[50] = { 0 };
int v1 = 0, v2 = n+1;
int flag = 0;
while (exam(arr, n))
{
v1 = go(arr, n, k, v1, 1);
v2 = go(arr, n, m, v2, -1);
if (flag == 0)
{
flag = 1;
printf("%3d", v1);
}
else
printf(",%3d", v1);
if (v1 != v2)printf("%3d", v2);
arr[v1] = arr[v2] = 1;
}
printf("\n");
}
}
The Dole Queue UVA - 133的更多相关文章
- 救济金发放(The Dole Queue, UVa 133)
n(n<20)个人站成一圈,逆时针编号为1-n.有两个官员,A从1开始逆时针数,B从n开 始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个 官员停在同一个人上) ...
- uva 133(The Dole Queue UVA - 133)
一道比较难想的模拟题,用了队列等东西,发现还是挺难做的,索性直接看了刘汝佳的代码,发现还是刘汝佳厉害! 代码本身难度并不是很大,主要还是p=(p+n+d-1)%n+1;这一句有些难度,实际上经过自己的 ...
- UVA 133 The Dole Queue
The Dole Queue 题解: 这里写一个走多少步,返回位置的函数真的很重要,并且,把顺时针和逆时针写到了一起,也真的很厉害,需要学习 代码: #include<stdio.h> # ...
- UVa133.The Dole Queue
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- The Dole Queue
The Dole Queue Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit cid ...
- uva133 The Dole Queue ( 约瑟夫环的模拟)
题目链接: 啊哈哈,选我选我 思路是: 相当于模拟约瑟夫环,仅仅只是是从顺逆时针同一时候进行的,然后就是顺逆时针走能够编写一个函数,仅仅只是是走的方向的标志变量相反..还有就是为了(pos+flag+ ...
- 水题:UVa133-The Dole Queue
The Dole Queue Time limit 3000 ms Description In a serious attempt to downsize (reduce) the dole que ...
- uva 133 The Dole Queue 双向约瑟夫环 模拟实现
双向约瑟夫环. 数据规模只有20,模拟掉了.(其实公式我还是不太会推,有空得看看) 值得注意的是两个方向找值不是找到一个去掉一个,而是找到后同时去掉. 还有输出也很坑爹! 在这里不得不抱怨下Uva的o ...
- uva - 133 The Dole Queue(成环状态下的循环走步方法)
类型:循环走步 #include <iostream> #include <sstream> #include <cstdio> #include <cstr ...
随机推荐
- 在测试自定义starter时,若出现无法找到helloservice的Bean的解决方法
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoc ...
- Echart饼图旋转
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...
- Fastdfs数据迁移方案
1. 方案背景描述 环境迁移,需要迁移旧环境的fastdfs集群的数据到新环境,由于之前数据迁移仅仅是针对mysql和mongodb,对fastdfs数据的迁移了解甚少,本文档主要是针对fas ...
- CentOS 7.7+ Python3.7 下安装virtualenv和virtualenvwrapper
1. 安装virtualenv和virtualenvwrapper # pip install virtualenv # pip install virtualenvwrpper 2. 寻找virtu ...
- Linux内核的TCP协议栈和内核旁路的选择?
[前言]最近在实习公司用到了solarflare的万兆网卡,用到了网卡的openonload技术还有TCPDirect模式代码的编写,其理论基础都是内核旁路.网上关于内核旁路技术的介绍基本就两篇,我结 ...
- JPEG解码——(5)反量化和逆ZigZag变换
本篇是该系列的第五篇,承接上篇huffman解码,介绍接下来的两个步骤--反量化和逆zigzag变换,即IDCT前的两个步骤. 需要说明的是,这两个步骤可以颠倒,本人的实现是,先反量化,再逆ZigZa ...
- 保姆级别学生党安装Clion IDE(面向华师同学)
保姆级别学生党安装Clion IDE(面向华师同学) 界面UI 废话不多说,直接上图 具备功能 UI美观 (下面会介绍) 基础的代码编写能力 大容量的IDE插件 (下面会介绍) 代码补全,以及搭配Ki ...
- 数组的常用方法之split
今天我们来聊一下数组的常用方法:split 返回值:一个新数组. 1.该方法可以直接调用不传任何值,则会直接将字符串转化成数组. var str = 'I love Javascript'; cons ...
- 【转载】几张图轻松理解String.intern()
出处:https://blog.csdn.net/soonfly/article/details/70147205 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.i ...
- Image Super-Resolution via Sparse Representation——基于稀疏表示的超分辨率重建
经典超分辨率重建论文,基于稀疏表示.下面首先介绍稀疏表示,然后介绍论文的基本思想和算法优化过程,最后使用python进行实验. 稀疏表示 稀疏表示是指,使用过完备字典中少量向量的线性组合来表示某个元素 ...