1. 程式人生 > >救濟金髮放UVa133

救濟金髮放UVa133

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列。

#include<iostream>
using namespace std;
const int maxn =25;
int a[maxn],n,k,m;
int
f(int p, int d,int t){//模擬走步數,若符合情況就返回 while(t--){ do{ p=(p+d+n-1)%n+1; }while(a[p]==0); } return p; } int main(void){ cin>>n>>k>>m; for(int i=1;i<=n;i++) a[i]=i; int p1=n,p2=1,left=n; while(left){ p1=f(p1,1,k); p2=f(p2,-1
,m); cout<<p1<<" ";left--; if(p1!=p2){ cout<<p2;left--; } a[p1]=a[p2]=0; if(left)cout<<","; } cout<<endl; return 0; }