UVa 133 算法竞赛入门经典4-3例题(约瑟夫环类型)
2017-01-20 12:31
435 查看
题目类型:约瑟夫环模型, 函数的简单应用, 自顶向下编程
题目大意 : 输入n, k, m; n个人站成圆环,k,m, 分别代表停顿中间间隔的人数, 其中一个顺时针旋转,一个逆时针旋转, 直 至环中没有人。
注意 : 1次旋转的时候,只有顺逆都完成,所选出的两个人才都被cut到, 不能一个一个的cut,这样会少一个。
难点:怎么弄出来一个圈???
(pos+flag+n-1)%n+1 公式的妙用, 这样控制循环的下一个,不会跑出来。
例题代码:
题目大意 : 输入n, k, m; n个人站成圆环,k,m, 分别代表停顿中间间隔的人数, 其中一个顺时针旋转,一个逆时针旋转, 直 至环中没有人。
注意 : 1次旋转的时候,只有顺逆都完成,所选出的两个人才都被cut到, 不能一个一个的cut,这样会少一个。
难点:怎么弄出来一个圈???
(pos+flag+n-1)%n+1 公式的妙用, 这样控制循环的下一个,不会跑出来。
例题代码:
#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)) { if(n == 0 && m == 0 && k == 0) break; int i; for(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; }
相关文章推荐
- 【算法竞赛入门经典】多阶段决策问题 例题9-5 UVa12563
- 【算法竞赛入门经典】7.5 路径寻找问题 例题7-9 UVa1601(1)
- 【算法竞赛入门经典】递归结构的动态规划 例题9-10 UVa1626
- 算法竞赛入门经典第六章例题6-3 Matrix Chain Multiplication UVA - 442
- 算法竞赛入门经典第四章例题4-2 Hangman Judge UVA - 489
- 【算法竞赛入门经典】动态规划初步 例题9-7 UVa11584
- 【算法竞赛入门经典】6.5[图的BFS] 例题6-20 UVa1599 (2)
- 算法竞赛入门经典第五章例题5-7 Ugly Numbers UVA - 136
- 【算法竞赛入门经典】动态规划初步 例题9-6 UVa11400
- 【算法竞赛入门经典】6.4.2用BFS求最短路 例题6-14 UVa816
- 【算法竞赛入门经典】回溯法与最优性剪枝条 例题7-6 UVa140
- 【算法竞赛入门经典】DAG上的动态规划 例题9-2 UVa437
- 算法竞赛入门经典 第二版 例题11-4 电话圈 Calling Circles uva247
- 算法之路二:刘汝佳算法竞赛入门经典 救济金发放 UVa133
- 【算法竞赛入门经典】树的最大独立集、树的唯一性问题 例题9-13 UVa1220
- 【算法竞赛入门经典】树形DP的状态转移方程优化 例题9-14 UVa1218
- 算法竞赛入门经典第六章例题6-7 Trees on the level UVA - 122
- 【算法竞赛入门经典】6.5[图的概念和拓扑序] 例题6-21 UVa506
- 算法竞赛入门经典第五章例题5-5 The SetStack Computer UVA - 12096
- 【算法竞赛入门经典】7.7 回溯法求连通块 例题7-14 UVa1602