• (约瑟夫问题延伸)5.1.2The 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.

    Input

    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).

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

    Sample input

    10 4 3
    0 0 0

    Sample output

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

    where tex2html_wrap_inline50 represents a space.

     这么简单的一道题竟然让我做了两三个小时,靠,其实说白了还是语言不会,虽然是算法简单但是却不会用语言实现!!

    只是注意怎样判断如果数组到头了怎么继续进行,怎样循环进行了;还有怎样在找出后不再进行终止当前小循环就行了,很简单!!!!!!

    开始的超复杂:

    #include<iostream>
    #include <cstring>
    #include <iomanip>
    #include<algorithm>
    using namespace std;
    int main( )
    {
     int n,x,y,count,xxx,yyy,jishu,aaa,bbb,w;
     cin>>n>>x>>y;
     while(!(n==0&&x==0&&y==0))
     {
      int a[25];
      memset(a,-1,100);
      count=n;xxx=1;//////////记录当前逆时针找人位置

                               ////////////////这样的地方注意初始化的数是几,这道题的话要是初始化为0就在后面特别麻烦
      yyy=n; ////////////记录当前顺时针找人位置////////////////
      while(count>0)////////圈内剩余人数
      {
       jishu=0;w=1;while(jishu<=x)////////如果逆时针找的人数不够第x个,就继续查找
       {
        if(a[xxx]==-1)
        {
         jishu++;
         if(jishu==x&&w==1)
         {
          aaa=xxx;
          w=0;
         }
        }
        xxx++;
        if(xxx>n)xxx=1;
       }
       jishu=0;
       w=1;
       while(jishu<=y)
       {
        if(a[yyy]==-1)
        {
         jishu++;
         if(jishu==y&&w==1)
         {
          bbb=yyy;
          w=0;
         }
        }

        yyy--;
        if(yyy<=0)yyy=n;
       }
       xxx--;
       if(xxx>n)
        xxx=1;
       yyy++;
       if(yyy<=0)yyy=n;
       a[aaa]=a[bbb]=0;
       cout<<setfill(' ')<<setw(3);
       if(aaa==bbb)
       {
        cout<<aaa;
        count--;
       }
       else
       {
        cout<<aaa;
        cout<<setfill(' ')<<setw(3);
        cout<<bbb;
        count=count-2;
       }
       if(count>0)
        cout<<',';
      }
      cout<<endl;
      cin>>n>>x>>y;
     }
     return 0;
    }

    #include<iostream>
    #include <cstring>
    #include <iomanip>
    #include<algorithm>
    using namespace std;
    int main( )
    {
     int n,x,y,count,xxx,yyy,jishu;
     cin>>n>>x>>y;
     while(!(n==0&&x==0&&y==0))
     {
      int a[25];
      memset(a,-1,100);
      count=n;
      xxx=1;//////////记录当前逆时针找人位置////////////////
      yyy=n; ////////////记录当前顺时针找人位置////////////////
      while(count>0)////////圈内剩余人数
      {
       jishu=0;
       while(1)////////如果逆时针找的人数不够第x个,就继续查找
       {
        if(a[xxx]==-1)
            jishu++;
        if(jishu==x)
          break;

                        //注意这个地方特别重要,不然会出现在找出所要找的之后,如果是后面的已经标记为0(即已经剔除列的)

                           //就还会继续进行这样的话记录的xxx就会出错了
        xxx++;
        if(xxx>n)
         xxx=1; 
       }
       jishu=0;
       while(1)
       {
        if(a[yyy]==-1)
         jishu++;
        if(jishu==y)
          break;
        yyy--;
        if(yyy<=0)
         yyy=n;
       }
       a[xxx]=a[yyy]=0;
       cout<<setfill(' ')<<setw(3);
       if(xxx==yyy)
       {
        cout<<xxx;
        count--;
       }
       else
       {
        cout<<xxx;
        cout<<setfill(' ')<<setw(3);
        cout<<yyy;
        count=count-2;
       }
       if(count>0)
        cout<<',';
      }
      cout<<endl;
      cin>>n>>x>>y;
     }
     return 0;
    }


     

  • 相关阅读:
    JNI接口的使用(简单版)
    Android内核剖析(1)
    Spring 和 Mybatis 整合
    AppStore被拒原因及总结
    iOS开发中,应用内直接跳转到Appstore
    ios 中生成二维码和相册中识别二维码
    IOS开发中(null)与<null>的处理
    融云即时通讯~~
    iOS中菊花。。。
    关于判断邮箱 手机号等一系列的正则表达式
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432130.html
Copyright © 2020-2023  润新知