救济金发放

来源:互联网 发布:手机同步翻译软件 编辑:程序博客网 时间:2024/04/29 00:18

n(n<20)个人站成一圈,逆时针编号为1~n。 有两个官员,A从1开始逆时针数,B从n开始顺时针数。 在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上)。 接下来被官员选中的人(1个或者2个)离开队伍。输入n,k,m输出每轮里被选中的人的编号(如果有两个人,先输出被A选中的)。 例如,n=10,k=4,m=3,输出为4 8, 9 5, 3 1, 2 6, 10, 7。 注意:输出的每个数应当恰好占3列。

几个注意点:从1开始数,把1包含里面,所以从n开始数,从n开始数,为了把n包含在里面,从1开始。p = (p + d + n-1)%n + 1,为了把顺时针的合并所以加上了n-1,因为逆时针d = 1,d+n-1=n.对于顺时针来说没有用。

#include <stdio.h>#define maxn 25int n, a[maxn];int go(int p, int q, int t){while(t--){do {p = (p + q + n-1)%n + 1;}while(a[p] == 0);}return p;}int main(){int  k, m, p1, p2, left;while(scanf("%d %d %d", &n, &k, &m) == 3 && n){left = n, p1 = n, p2 = 1; for(int i = 1; i <= n; i++) a[i] = i;while(left) {p1  = go(p1, 1, k);p2 = go(p2, -1, m);printf("%d",p1);left--;a[p1] = 0;if(p1 != p2) {printf(" %d", p2);left--;a[p2] = 0;}if(left) printf(",");}printf("\n");}return 0;}


0 0
原创粉丝点击