救济金发放The Dole QueueUVA 133

本文介绍了一个双向约瑟夫环问题的解决方案,通过逆序输入的方式建立数组,并使用两个指针分别从顺时针和逆时针方向进行遍历,每次遍历到指定步数后移除相应位置的人,直到最后剩下一个人。此算法适用于编程竞赛等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. #include<cstdio>
  2. int main(){
  3.     int a[25];
  4.     int N,k,m;
  5.     while(scanf("%d%d%d",&N,&k,&m)==3 && N){
  6.         for(int i=N-1;i>=0;i--){      //倒序输入
  7.             a[N-i-1]=i+1;
  8.         }
  9.         int leave=N;
  10.          int k1=N-1;     //逆序
  11.          int m1=0;       //顺序
  12.         while(leave){    //当留下0人时退出循环
  13.             for(int i=0;i<k;i++){
  14.                 if(a[k1=(N+k1)%N]==0)i--;
  15.                 k1--;
  16.             }
  17.             k1++;

  18.             for(int i=0;i<m;i++){
  19.                 if(a[m1=(m1%N)]==0)i--;
  20.                 m1++;
  21.             }
  22.             m1--;

  23.             if(m1!=k1){
  24.                 leave-=2;
  25.                 if(leave)
  26.                 printf("%3d%3d,",a[k1],a[m1]);
  27.                 else printf("%3d%3d",a[k1],a[m1]);
  28.                 a[k1]=0;a[m1]=0;
  29.             }
  30.             else {
  31.                 leave--;
  32.                 if(leave)
  33.                 printf("%3d,",a[k1]);
  34.                 else printf("%3d",a[k1]);
  35.                 a[k1]=a[m1]=0;
  36.             }
  37.         } 
  38.         printf("\n");
  39.     }
  40.     return 0;
  41. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值