zoukankan      html  css  js  c++  java
  • HDU 1276 士兵队列训练问题

    Description

    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 
     

    Input

    本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 
     

    Output

    共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 
     

    Sample Input

    2 20 40
     

    Sample Output

    1 7 19 1 19 37
     

     思路:用链表模拟

    #include<iostream>
    #include<cstdio>
    #include<list>
    using namespace std;
    
    list<int>lis;
    int n,len;
    
    void Init()
    {
        lis.clear();
        cin>>n;
        for(int i=1;i<=n;i++) lis.push_back(i);
       // cout<<lis.size()<<endl;
    }
    
    void Work()
    {
        list<int>::iterator it,ip;
        int flag=2,i=1,j,lench;
        len=n;
        while(len>3)
        {
            j=0;
            i=0;
            lench=len;
        for(it=lis.begin();it!=lis.end();)
        {
            i++;
            j++;
            if(j==lench+1) break;
            if(i==flag) {ip=it;it++;lis.erase(ip);len--;i=0;}    //先it++,再进行删除
            else it++;
        }
        flag=flag==2?3:2;
        }
       // cout<<len<<endl;
    }
    
    void Print()
    {
       list<int>::iterator ir;
       int i=1;
       for(ir=lis.begin();ir!=lis.end();ir++)
       {
           cout<<*ir;
           if(i==len) break;
           cout<<" ";
           i++;
       }
       cout<<endl;
      // cout<<*(ir++)<<endl;
    }
    
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
         Init();
         Work();
         Print();
        }
        return 0;
    }

     

    #include<iostream>
    #include<cstdio>
    #include<list>
    using namespace std;
    
    list<int>lis;
    int n,len;
    
    void Init()
    {
        lis.clear();
        cin>>n;
        for(int i=1;i<=n;i++) lis.push_back(i);
        //cout<<*(++lis.end())<<" "<<*lis.end()<<endl;
    }
    
    void Work()
    {
        list<int>::iterator it,ip;
        int flag=2,i=1,j,lench;
        len=n;
        while(len>3)
        {
            j=0;
            i=0;
            lench=len;
        for(it=++lis.end();it!=lis.end();)
        {
            i++;
            j++;
            if(j==lench+1) break;
            if(i==flag) {ip=it;it++;lis.erase(ip);len--;i=0;}
            else it++;
        }
        flag=flag==2?3:2;
        }
       // cout<<len<<endl;
    }
    
    void Print()
    {
       list<int>::iterator ir;
       int i=1;
       for(ir=++lis.end();ir!=lis.end();ir++)
       {
           cout<<*ir;
           if(i==len) break;
           cout<<" ";
           i++;
       }
       cout<<endl;
      // cout<<*(ir++)<<endl;
    }
    
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
         Init();
         Work();
         Print();
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    TeamViewer14
    mysql 导出表结构和表数据 mysqldump用法
    虚拟机中不能上外网
    Mysql初始化root密码和允许远程访问
    常用sql语句
    查看连接MYSQL数据库的IP信息
    设置linux下shell显示不同颜色的字体
    常用mysql导入导出数据的命令
    spring boot 以jar的方式启动常用shell脚本
    idea的properties文件乱码问题解决
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4662461.html
Copyright © 2011-2022 走看看