您的位置:首页 > 其它

杭电1276士兵队列的训练问题

2015-07-15 18:02 423 查看
杭电1276士兵队列的训练问题

本来这题想用直接的模拟法去解答,但一看数据为5000,也还是可以,可是模拟是用数组的话无法直接去掉被删除的元素,用链表可以完全模拟,但是链表操作比较麻烦,想尽量避免链表操作的使用。所以本题就想到了用两个链表来回操作来进行模拟。

首先定义两个数组s1,s2。s1先存储所有士兵的编号,然后由于依次报到2的士兵都会被出列,数组下标与编号对应,这样就可以把数组下标为奇数的元素转到s2,从下标为1连续存储。再依次报到3,士兵出列,再把在数组s2中下标模3不等于0的元素转移到s1中。下标为1依次存储。这样来回转换,利用变量K依次记录转换后还剩下的元素个数,这样来回转换,知道K<=3时停止,对数组s1,或者s2中的元素进行输出

ps:注意士兵数量n<=3的情况,直接对数组元素进行输出。

注意两个输出编号之间的空格。

AC代码:

#include<iostream>
using namespace std;
int main()
{
    int st[6000];
    int oz[6000];
    int n;
    cin>>n;
    while(n--)
    {
        int t;
        int i,j,k;
        cin>>t; 
        if(t<=3)
        {
            for(int i=1;i<t;i++)
            {
            cout<<i<<' ';
            }
            cout<<t<<endl;
        }
        else
        {
        int flag=0;
        for(i=1;i<=t;i++)
        {
            st[i]=i;
        }
        while(t>3)
        {
            
             j=1;
        for( i=1;i<=t;i+=2)
        {
            oz[j++]=st[i];
        }
        //t=(t+1)>>1;
        t=j-1;
        if(t<=3)
        {
            flag=1;
            break;
        }
        k=1;
        for(i=1;i<=t;i++)
        {
            if(i%3!=0)
            {
            st[k++]=oz[i];
            }
        }
        t=k-1;
        if(t<=3)
        {
            flag=2;
            break;
        }
        }
if(flag==1)
{
    for(i=1;i<t;i++)
    {
        cout<<oz[i]<<' ';
    }
    cout<<oz[t]<<endl;
}
if(flag==2)
{
    for(i=1;i<t;i++)
    {
        cout<<st[i]<<' ';
    }
    cout<<st[t]<<endl;
}
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: