队列练习1 : HDOJ1276

本文介绍了一个使用两个队列进行模拟的算法实现案例。该算法通过交替操作两个队列来解决特定问题,并特别关注了输出格式及特殊情况处理,如当输入n为1、2、3时的边界情况。

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

简单模拟,用了两个队列会比较清晰。

输出的时候格式需要稍微注意一下。

最坑的是n等于1,2,3的时候也需要考虑,这个bug纠结了一中午。

以后举例子的时候一定不要想当然,,从最小的数字开始试验才是最吼的。

#include <iostream>
#include <queue>

using namespace std;
queue<int> q1, q2 ;

int main()
{
    int N, key;
    int n, stop=0, len, a ;
    cin >> N ;
    while(N--)
    {
        stop = 0, key = 2 ;
        while(!q1.empty())
            q1.pop();
        while(!q2.empty())
            q2.pop();
        cin >> n ;
        if(n == 2 || n == 3 )
            stop = 1 ;
        for(int i = 1 ; i <= n ; i++)
            q1.push(i) ;
        while(stop!=1)
        {
            if(key == 2)
            {
                len = q1.size();
                for(int i = 1 ; i <= len ; i++)
                {
                    if(i%2!=0)
                    {
                        a = q1.front() ;
                        q1.pop() ;
                        q2.push(a) ;
                    }
                    else
                        q1.pop() ;
                }
                key = 3 ;
                if(q2.size() <= 3)
                    stop = 1 ;
            }
            else
            {
                len = q2.size();
                for(int i = 1 ; i <= len ; i++)
                {
                    if(i%3!=0)
                    {
                        a = q2.front() ;
                        q2.pop() ;
                        q1.push(a) ;
                    }
                    else
                        q2.pop() ;
                }
                key = 2 ;
                if(q1.size() <= 3)
                    stop = 1 ;
            }
        }

        if(key == 3)
        {
            cout << q2.front() ;
            q2.pop() ;
            while(!q2.empty())
            {
                cout << " " << q2.front() ;
                q2.pop() ;
            }
        }
        else
        {
            cout << q1.front() ;
            q1.pop() ;
            while(!q1.empty())
            {
                cout << " " << q1.front() ;
                q1.pop() ;
            }
        }
        cout << endl ;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值