UVa 133 The Dole Queue 一些反思
2017-09-26 06:39
399 查看
就按照紫书上的解法来吧。
写过紫书P52页的 UVa1584 Circular Sequence 这一题之后,对此题多多少少会有些思路,我当时是想着定义一个数组,将还未被选中的人设置为1,选中过的人设置为0,然后只有A,B官员移动到为1的人时,才算移动一步,否则不算,继续往下走,遇到尾部或头部,处理一下就行。
可是在处理的时候就很尴尬了,按题中描述,一开始A,B官员都处于值为1的人员身前,而之后每一次开始移动就都处于值为0的人员身前。我之前就一直想着怎么才能将两种情况合并,以便于减少代码量。想了许久(可能我实在是蠢了点)都没想出个好办法……一看紫书,才发现,只须让A,B一开始处于其本该所在位置的后一个位置,(即让A位于n,B位于1)这样一来我们就可以将两种情况统一处理了,当我们每次需要移动时候就先往下走一步,然后从下一个值不为0的人员开始计数,这里紫书是使用了do {…}while(…)循环。
这里对p也处理的十分好,若不这样处理直接写成(p+d+n)%n这样是会出现p为0和p无法取值到n的情况,紫书上为保存人员状态是只初始化了一部分下标为1到n的数组元素,通过上面的处理就避免了这一问题。值得好好学习。
#include<stdio.h> #define maxn 25 int n, k, m, a[maxn]; int go(int p, int d, int t) { while(t--) { do{ p = (p+d+n-1) % n + 1; } while(a[p] == 0); } return p; } int main() { while(scanf("%d%d%d", &n, &k, &m) == 3 && n) { for(int i = 1; i <= n; ++i) a[i] = i; int left = n; int p1 = n, p2 = 1; while(left) { p1 = go(p1, 1, k); p2 = go(p2, -1, m); printf("%3d", p1); left--; if(p2 != p1) { printf("%3d", p2); left--; } a[p1] = a[p2] = 0; if(left) printf(","); } printf("\n"); } return 0; }
写过紫书P52页的 UVa1584 Circular Sequence 这一题之后,对此题多多少少会有些思路,我当时是想着定义一个数组,将还未被选中的人设置为1,选中过的人设置为0,然后只有A,B官员移动到为1的人时,才算移动一步,否则不算,继续往下走,遇到尾部或头部,处理一下就行。
可是在处理的时候就很尴尬了,按题中描述,一开始A,B官员都处于值为1的人员身前,而之后每一次开始移动就都处于值为0的人员身前。我之前就一直想着怎么才能将两种情况合并,以便于减少代码量。想了许久(可能我实在是蠢了点)都没想出个好办法……一看紫书,才发现,只须让A,B一开始处于其本该所在位置的后一个位置,(即让A位于n,B位于1)这样一来我们就可以将两种情况统一处理了,当我们每次需要移动时候就先往下走一步,然后从下一个值不为0的人员开始计数,这里紫书是使用了do {…}while(…)循环。
int go(int p, int d, int s) { while(s--) { do{ p = (p+d+n-1)%n + 1; } while(a[p] == 0); } return p; }
这里对p也处理的十分好,若不这样处理直接写成(p+d+n)%n这样是会出现p为0和p无法取值到n的情况,紫书上为保存人员状态是只初始化了一部分下标为1到n的数组元素,通过上面的处理就避免了这一问题。值得好好学习。
相关文章推荐
- UVA - 133 The Dole Queue(模拟链表)
- uva - 133 The Dole Queue(成环状态下的循环走步方法)
- UVA133 The Dole Queue
- UVa 133 The Dole Queue(圈的下标处理)
- uva-133 The Dole Queue
- UVa133 - The Dole Queue
- uva133-The Dole Queue
- UVa-133 The Dole Queue
- UVa133--The Dole Queue
- UVa 133 - The Dole Queue
- 紫书章四例题3——UVA 133 TheDole Queue
- UVA133 The Dole Queue【模拟】
- The Dole Queue UVA - 133(依次抓走做夫妻肺片)
- uva133 The Dole Queue 循环队列模拟
- UVa 133 - The Dole Queue
- UVA 133(82)----The Dole Queue
- uva_133_The Dole Queue
- 紫书章四例题3——UVA 133 TheDole Queue
- 救济金发放 (The Dole QUEUE UVa 133)
- UVa133 - The Dole Queue