救濟金髮放UVa133
阿新 • • 發佈:2018-12-26
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;
}