救济金发放 (The Dole QUEUE UVa 133)

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"stdio.h"
#define max 20
int n,k,m;
int a[max];
int count1=0,count2=0;
int chu1(int a[],int t)   //形参为传入数组a[]及点到的人数t 
{
   int i=1;
   while(i<=t){
       ++count1;          //逆时针正数 
       if(count1==n+1){
               count1=1;
           }
           
       while(a[count1]==0){   //数过的人就跳过去 
           ++count1;
           
           if(count1==n+1){   //数到最后,返回1重新数 
               count1=1;
           }
       }
      
       ++i;
   } 
     
    return a[count1];
}

int chu2(int a[],int t)
{
   int i=1;
   while(i<=t){
       
    -- count2;
       if(count2==0)
       {
               count2=n;
       }
       while(a[count2]==0)
       {
           -- count2;
           if(count2==0)
           {
               count2=n;
           }
       }
     
      ++ i;
   } 
     
    return a[count2];
}

int main()
{
    int i;
    int p,q;
    scanf("%d%d%d",&n,&k,&m);   //n 人数 k 逆时针数k人 m顺时针数 m人 
    for(i=1;i<=n;++i)   //排序 
    {
        a[i]=i;
    }
    
    int left = n;
    count2=n+1;
    
    while(left)  //查找left人 
    {
            p=chu1(a,k);  
            q=chu2(a,m);
        printf("%3d,",p);--left;
        if(q!=p) 
            {
                printf("%3d,",q);
               -- left; 
            }       
            a[p]=a[q] = 0;
    }
    printf("\n");

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值