例題4-3救濟金髮放
阿新 • • 發佈:2018-12-26
n個人站成一圈,逆時針編號為1到n,有兩個官員,A從1開始逆時針發放,B從n開始順時針發放。在每一輪中,官員A數k個就停下來,官員B數m個就停下來了(有可能兩個官員停在同一個人身上)。接下來被官員選中的人離開隊伍。
本來逆時針順時針應該寫兩個go函式,但是發現可以合併通過取餘運算和新增1和-1。
這個問題最關鍵的問題就是確定移動的步長,並且在陣列中迴圈,當遇到被換成0的元素就繼續下一個。p=(p+d+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)==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; }