zoukankan      html  css  js  c++  java
  • HDU1276(士兵队列训练模拟与链表)

                           HDU1276

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
     

    Description

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

    Input

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

    Output

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

    Sample Input

    2 20 40
     

    Sample Output

    1 7 19 1 19 37
     
     
    题解:本来题目是用链表的方法,本人愚钝,不会用,看了别人的博客才明白,在最后展示
    我采用模拟的方法,即直接按照题意写出。
             要注意最后输出的格式!
     
     
     
    下面这个代码是错误的。很久才找到错误所在。只是一个小小的错误(最下面有AC的代码)
    #include<iostream>
    using namespace std;
    int main()
    {
        int i,t,n,p;
        int f=0;
        int a[5100];
        cin>>t;
        while(t--)
        {
            int q;//定义整型变量,n赋值给q
            cin>>n;
            q=n;
            for(i=1; i<=n; i++)
                a[i]=i;
            while(q>3)  //判断条件
            {
                    
                p=0;
                for(i=1; i<=n; i++)
                {
                    if(a[i]==0)
                        continue;
                    else  
                        p++;
                    if(p==2)
                    {
                        a[i]=0;
                        f+=1;    //统计出列士兵个数
                        p=0;
                    }
                }
                q=q-f;
                if(q<=3)break;
                p=0;
                f=0;             //注意每次归0
                for(i=1; i<=n; i++)
                {
                    if(a[i]==0)
                        continue;
                    else 
                        p++;
                    if(p==3)
                    {
                        a[i]=0;
                        f+=1;
                        p=0;
                    }
                }
                q=q-f;
            }
            p=0;
            for(int i=1; i<=n; i++)
            {
                if(a[i]==0) 
                    continue;
                else
                {
                    p+=1;
                    if(p==q)
                        cout<<a[i]<<endl;
                    else
                        cout<<a[i]<<" ";
                }
            }
        }
        return 0;
    
    }

    这个才是正确的,错误的地方有标记

    #include<iostream>
    using namespace std;
    int main()
    {
        int i,t,n,p;
        int a[5100];
        cin>>t;
        while(t--)
        {
            int q;//定义整型变量,n赋值给q
            cin>>n;
            q=n;
            for(i=1; i<=n; i++)
                a[i]=i;
            while(q>3)  //判断条件
            {
                int f=0;//这里!!    
                p=0;
                for(i=1; i<=n; i++)
                {
                    if(a[i]==0)
                        continue;
                    else  
                        p++;
                    if(p==2)
                    {
                        a[i]=0;
                        f+=1;    //统计出列士兵个数
                        p=0;
                    }
                }
                q=q-f;
                if(q<=3)break;
                p=0;
                f=0;             //注意每次归0
                for(i=1; i<=n; i++)
                {
                    if(a[i]==0)
                        continue;
                    else 
                        p++;
                    if(p==3)
                    {
                        a[i]=0;
                        f+=1;
                        p=0;
                    }
                }
                q=q-f;
            }
            p=0;
            for(int i=1; i<=n; i++)
            {
                if(a[i]==0) 
                    continue;
                else
                {
                    p+=1;
                    if(p==q)
                        cout<<a[i]<<endl;
                    else
                        cout<<a[i]<<" ";
                }
            }
        }
        return 0;
    
    }

    参考小云博客:链表使用,与模拟还是很相像的

    #include"iostream"
    #include"list"
    using namespace std;
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int n;
            cin>>n;
            list<int> s;
            if(n==0) cout<<0<<endl;
            else
            {
                for(int i=1; i<=n; i++)
                    s.push_back(i);
                list<int>::iterator it,ip;//链表遍历迭代器
                int f=1;
                int flag=s.size();    
                while(flag>3)
                {
                    for(it=s.begin(); it!=s.end();)
                    {
                        if(f==2)
                        {
                            f=1;
                            ip=it;
                            it++;
                            s.erase(ip);   //抹除操作
                            flag--;
                        }
                        else
                        {
                            f++;
                            it++;
                        }
                    }
                    f=1;
                    if(flag<=3) break;
                    for(it=s.begin(); it!=s.end();)
                    {
                        if(f==3)
                        {
                            f=1;
                            ip=it;
                            it++;
                            s.erase(ip);
                            flag--;
                        }
                        else
                        {
                            f++;
                            it++;
                        }
                    }
                    f=1;
                    if(flag<=3) break;
                }
                int w=0;
                for(it=s.begin(); it!=s.end(); it++)
                {
                    cout<<(*it);              //注意输出格式
                    w++;
                    if(w<=flag-1) cout<<' ';
                }
                cout<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    bzoj1901 Zju2112 Dynamic Rankings
    bzoj3932 [CQOI2015]任务查询系统
    poj2104 K-th Number
    splay模板整理
    bzoj1500 [NOI2005]维修数列
    bzoj3223 Tyvj 1729 文艺平衡树
    bzoj1503 [NOI2004]郁闷的出纳员
    bzoj3224 Tyvj 1728 普通平衡树
    用CSS截断字符串
    发布一款仿天猫产品放大镜JQuery插件
  • 原文地址:https://www.cnblogs.com/hfc-xx/p/4665118.html
Copyright © 2011-2022 走看看