参考资料

  [1]:紫书P82

•题意(by紫书)

  

  按照被选中的次序输出这 n 个人的编号;

  如果A和B选中的是同一个人,输出一个这个人的编号;

  输出格式:输出的每个编号占3个字节,不够3个字节在前面用空格补;

•循环报数处理技巧

  n个人按照逆时针顺序编号1~n;

  给你一个整数 k 和 cur;

  cur表示从这 n 个人中任意选取的一个编号;

  k > 0 : 找 cur 左手边的第 k 个人的编号;

  k < 0 : 找 cur 右手边的第 k 个人的编号;

  循环报数问题,需要处理的边界问题是:

    编号 1 的左手边的人的编号为 n;

    编号 n 的右手边的人的编号为 1;

  之前常用的处理的方式为,循环处理,如果 cur 从编号 n 来到编号 n+1,特判,令其等于 1;

  反之,如果 cur 从编号 1 来到编号 0,特判,令其等于 n;

  下面说下一我从紫书上学到的技巧;

1 pos = (cur + k - 1 + n)%n + 1;
pos : 从cur编号顺时针或逆时针找到的第k个人的编号
k : k > ,找cur右手边的第k个人的编号,反之找cur左手边的第k个人的编号;
 while(~scanf("%d%d%d",&n,&cur,&k))
{
k=k%n;
int pos=(cur+k-1+n)%n+1;
cout<<pos<<endl;
}

•我的理解

  

  n个人顺时针围城一圈,从 x 位置开始,顺时针找其左(或逆时针找其右)手边的第 k 个人(-n < k < n , k > 0 顺时针找, k < 0 逆时针找);

  假设 k > 0 ,那么第 k 个人的编号为:

  

  合并这两个式子就是

    nextPos = (x+k-1+n)%n+1;

  简单证明这个式子得正确性:

    ①如果 x+k ≤ n,那么 (x+k-1+n)%n+1 = x+k;

    ②如果 x+k > n:

      1)x+k = n+1 : (x+k-1+n)%n+1 = 1;

      2)x+k > n+1 : (x+k-1+n)%n 就是目的编号的前一个编号,+1就等于目的编号;

  那如果 k < 0 呢?

  假设找 x 左手边的第 y 个人的编号 = 找 x 右手边的第 k 个人的编号;

  那么 |k| + y = n,也就是 y = n-|k|;

  带入上式得:

    nextPos = (x+n-|k|-1+n)%n+1;

  即 nextPos = (x-|k|-1+n)%n+1;

  综上,不论 k 是大于0还是小于0,nextPos = (x+k-1+n)%n+1;

•Code

 #include<bits/stdc++.h>
using namespace std;
#define memF(a,b,n) for(int i=0;i <= n;a[i++]=b); int n,k,m;
bool vis[]; int Go(int cur,int d,int x)
{
/**
d=1:逆时针找第x个人
d=-1:顺时针找第x个人
当前的cur肯定是不满足条件的位置
所以初始 a=n,b=1
之后,a,b的值就是上一次出队的编号
*/
while(x--)
{
do
{
cur=(cur+d-+n)%n+;
}while(vis[cur]);
}
return cur;
}
void Solve()
{
memF(vis,false,n); int a=n,b=;
int left=n;
while(left--)
{
a=Go(a,,k);
b=Go(b,-,m); vis[a]=true;
vis[b]=true; printf("%3d",a);
if(b != a)
{
left--;
printf("%3d",b);
}
if(left)
printf(",");
}
printf("\n");
}
int main()
{
while(~scanf("%d%d%d",&n,&k,&m) && n+k+m)
Solve(); return ;
}

UVA 133“The Dole Queue”(循环报数处理技巧)的更多相关文章

  1. UVA 133 The Dole Queue

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

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

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

  3. UVA 133 The Dole Queue(报数问题)

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

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

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

  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. 47.关于gradle的解疑

    Short Answer Gradle is a build system. Long Answer Before Android Studio you were using Eclipse for ...

  2. docker安装中附带安装的其他软件

    aufs-tools: Tools to manage aufs filesystems. aufs的全称是advanced multi-layered unification filesystem, ...

  3. c# 操作access数据库image ole字段

    using System; using System.Data; using System.Configuration; using System.Web; using System.Data.Ole ...

  4. 【转】Unity 游戏存档 PlayerPrefs类的用法

    http://www.cnblogs.com/qiaogaojian/p/5969855.html unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs.工作原理非常简单,以 ...

  5. HDFS设计思想

    HDFS设计思想 DataNode:用来在磁盘上存储数据 HDFS  数据存储单元( block ) 1 文件被切分成固定大小的数据block块 •默认数据块大小为 64MB(hadoop1.x版本6 ...

  6. 事务ACID特性,其中I代表隔离性(Isolation)。

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  7. 洛谷P1175 表达式的转换

    P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...

  8. pat 甲级 1080. Graduate Admission (30)

    1080. Graduate Admission (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  9. 洛谷 [P2577] 午餐

    DP + 贪心 我们发现,如果只有一个窗口,贪心即可解决,吃饭时间长的人一定要先打饭 有两个窗口的时候,这条性质依然满足,但是两个窗口如何分配,需要 01 背包 #include <iostre ...

  10. python实现贪吃蛇

    贪吃蛇的算法还是比较简单的,蛇的移动我是通过不停添加一个head方块,然后判断应该加到蛇头的哪个方向,加完后删掉蛇尾就行了,如果吃到食物就不删蛇尾. 只是一个贪吃蛇只需要70行代码左右就可以了,后来又 ...