知识点:
队列
1、队列:先进先出 LILO
queue<int> q;//定义一个int 型的队列 ---------------------------------->队列
q.empty()//如果队列为空返回true,否则返回false
q.size() //返回队列中元素的个数
q.push() //在队尾压入新元素
q.front() //返回队首元素的值,但不删除该元素
q.pop() //删除队列首元素但不返回其值
q.back()//返回队列尾元素的值,但不删除该元素
2、双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后端,两端都可以入队和出队。
q.begin() 开头迭代器
q.end() 队尾迭代器,依旧是左闭右开,所以这个是空的
q.push_back(v) 在队尾加入v
q.push_front(v) 在队头加入v
q.front() 查询队头元素
q.back() 查询队尾元素
q.pop_front() 删掉队头元素
q.pop_back() 删掉队尾元素
声明deque容器:
#include<deque> // 头文件
deque<type> deq; // 声明一个元素类型为type的双端队列que
创建:
deque<int> deq;
题目分析: https://www.cnblogs.com/LIUWEI123/p/5676536.html
考虑:
1、 一行一行进行的,总剩下人数小于等于3
2、 判断是一到三还是一到二
3、 从队首出栈队尾入栈
题解代码:
#include<iostream>
#include<queue>
usingnamespace std;
queue<int> s;
void cmp(intk)
{
int i = 1;
while (s.front() != 0)
{
if (i%k != 0) {
s.push(s.front());
}
s.pop();
i++;
}
s.pop();s.push(0);
}
int main(void)
{
int N, n, i, j, k, l;
cin >> N;
while (N-- && cin>> N)
{
for (i = 1; i <= n;i++) {
s.push(i);s.push(0);
}
i= 1;
while (s.size()>4)
{
if (i % 2 == 0) {
cmp(3);
}else {
cmp(2);
}
i++;
}
i= 0;
while (!s.empty())
{
if (s.front()>0)
{
if (i)cout <<" "; i = 1;
cout<< s.front();
}
s.pop();
}
cout<< endl;
}
return 0;
}