In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros Party has decided on the following strategy. Every day all dole applicants will be placed in a large circle, facing inwards. Someone is arbitrarily chosen as number 1, and the rest are numbered counterclockwise up to N (who will be standing on 1’s left). Starting from 1 and moving counter-clockwise, one labour official counts off k applicants, while another official starts from N and moves clockwise, counting m applicants. The two who are chosen are then sent off for retraining; if both officials pick the same person she (he) is sent off to become a politician. Each official then starts counting again at the next available person and the process continues until no-one is left. Note that the two victims (sorry, trainees) leave the ring simultaneously, so it is possible for one official to count a person already selected by the other official. Input Writeaprogramthatwillsuccessivelyreadin(inthatorder)thethreenumbers(N, k and m; k,m > 0, 0 < N < 20) and determine the order in which the applicants are sent off for retraining. Each set of three numbers will be on a separate line and the end of data will be signalled by three zeroes (0 0 0). Output For each triplet, output a single line of numbers specifying the order in which people are chosen. Each number should be in a field of 3 characters. For pairs of numbers list the person chosen by the counterclockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a trailing comma). Note: The symbol ⊔ in the Sample Output below represents a space. Sample Input 10 4 3 0 0 0 Sample Output ␣␣4␣␣8,␣␣9␣␣5,␣␣3␣␣1,␣␣2␣␣6,␣10,␣␣7
先贴上我自己的代码,虽然它比较复杂
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k,m; 4 int main() 5 { 6 while(~scanf("%d %d %d",&n,&k,&m),n,k,m) 7 { 8 int a[n+1]; 9 for(int i=0;i<=n;i++) 10 a[i]=i; 11 int tot; 12 int t=0; 13 int f=1,s=n; 14 while(t<n){ 15 int kk=0,mm=0; 16 while(1) 17 { 18 if(a[f]!=0&&kk<k) 19 kk++; 20 if(kk==k) 21 { 22 t++; 23 printf("%3d",a[f]); 24 tot=f; 25 f=(f+1)%n; 26 if(f==0)f=n; 27 break; 28 } 29 f=(f+1)%n; 30 if(f==0)f=n; 31 } 32 while(1) 33 { 34 if(a[s]!=0&&mm<m) 35 mm++; 36 if(mm==m) 37 { 38 if(s==tot)break; 39 t++; 40 printf("%3d",a[s]); 41 a[s]=0; 42 s=(s+n-1)%n; 43 if(s==0)s=n; 44 break; 45 } 46 s=(s+n-1)%n; 47 if(s==0)s=n; 48 } 49 a[tot]=0; 50 if(t!=n)printf(","); 51 } 52 printf("\n"); 53 } 54 return 0; 55 }
有空再补一下大佬的想法,~