问题 A: 5.1.2 The Dole Queue

题目描述

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 counter-clockwise 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.

输入

Write a program that will successively read in (in that order) the three numbers (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).

输出

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 counter-clockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a trailing comma).

样例输入

10 4 3
0 0 0

样例输出

  4  8,  9  5,  3  1,  2  6, 10,  7

提示


Sample output:



△△4△△8,△△9△△5,△△3△△1,△△2△△6,△10,△△7



△表示空格


自己写的,结果没错,但是时间超时了55555555555555。第一次发写的不好我在继续努力!



#include<iostream>
using namespace std;
int main()
{   
 int n,k,m;       
   while(cin>>n>>k>>m&&n!=0&&k!=0&&m!=0)   
    {       
int a[n+1],*p1,*p2;      
     for(int i=1;i<=n;i++)      
 a[i]=i;a[0]=n+1;           
 p1=&a[1];p2=&a[n];             
 int c=0,d=0,b=0;     
 int t=0,y=n;         
int flsh=1;        
 while(flsh)        
{                 
 while(c!=k)           
   {                
 if(*p1!=0)                
c++;                
if(c==k)
break;               
  t++;               
 p1++;
  if(t==n)                
   {                   
 p1=&a[1];                   
t=0;               
  }       
 }                
  while(d!=m)   
{                   
if(*p2!=0)                        
 d++;               
if(d==m)


break;        

p2--;
if(*p2==n+1)                
{                   
p2=&a[n];                  
}               
} if(b==n-1)           
  {cout<<"  "<<*p1;flsh=0; break;}    
   if(*p1==*p2)             
  { cout<<" "<<*p1<<",";b++;c=d=0;*p1=0;*p2=0;  }         
if(*p1!=*p2)            
{                
cout<<"  "<<*p1;b++;c=0;*p1=0;                
cout<<"  "<<*p2<<",";b++;d=0;*p2=0;            
 }             
        
 
     }                
   }       
return 0;    
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值