先进先出
另外,还有一个 vis.back();是返回队尾元素!
除了int,还可以char,float等。。。
报数-队列-约瑟夫环
思路:把n个人放在队列里,通过循环一次报数,同时记录队首,当到m的倍数是就直接出队了,否则要先出队再入队
#include <bits/stdc++.h>
using namespace std;
queue<int>x;
int n,m,k;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
x.push(i);
int j=0;
while(x.size()!=1)
{
j++;
k=x.front();
if(j%m==0)
{
x.pop();
}
else
{
x.push(k);
x.pop();
}
}
int q=x.front();
cout<<q<<endl;
return 0;
}
酒桌游戏-队列
跟上一题思路相同,可以用数字对应名字,然后让数字一次入队进行循环即可
#include <bits/stdc++.h>
using namespace std;
queue<int>x;
int n,m,t;
char str[1000][100];
int main()
{
cin>>n>>m>>t;
for(int i=1;i<=n;i++)
{
cin>>str[i];
}
for(int i=1;i<=n;i++)
{
x.push(i);
}
int k;//接受队首元素
for(int i=1;i<m;i++)//先进行此步操作,把第一个报数得人移到队首
{
k=x.front();
x.push(k);
x.pop();
}
t--;//第一个报的数是t,所以得先进行t--
while(x.size()!=1)
{
int flag=0;
t++;
k=x.front();
if(t%7==0) flag=1;
int q=t;
while(q!=0)
{
int p=q%10;
if(p==7)
{
flag=1;
break;
}
else
{
q=q/10;
}
}//判断报的数是否含有7或者是7的倍数
if(flag==1)
{
x.pop();
}
else
{
x.push(k);
x.pop();
}
}
k=x.front();
cout<<str[k]<<endl;
return 0;
}
周末舞会-队列
思路:两个队列,循环即可
#include <bits/stdc++.h>
using namespace std;
queue<int>x1;
queue<int>x2;
int m,n,s1,s2,k;
int main()
{
cin>>m>>n>>k;
for(int i=1;i<=m;i++)
x1.push(i);
for(int i=1;i<=n;i++)
x2.push(i);
for(int i=0;i<k;i++)
{
s1=x1.front();
s2=x2.front();
cout<<s1<<" "<<s2<<endl;
x1.push(s1);
x1.pop();
x2.push(s2);
x2.pop();
}
return 0;
}
取牌游戏-队列-SET
题意就是一次升序输出小明的牌
思路:放在队列里循环即可,每发一张牌,就进行一步小循环来移牌
#include <bits/stdc++.h>
using namespace std;
queue<int>x;
int a[100010];
int n,k,p,t;//t用来取队首
int main()
{
cin>>n>>k>>p;
for(int i=1;i<=k;i++)
x.push(i);
int j=0,q=0;//j记发牌数,q记录数组下标
while(!x.empty())
{
j++;
if(j%n==0)
{
a[q]=x.front();
q++;
}
x.pop();
for(int z=1;z<=p;z++)
{
t=x.front();
x.push(t);
x.pop();
}
}
sort(a,a+k/n);
for(int i=0;i<k/n;i++)
cout<<a[i]<<endl;
return 0;
}
以下开始,就不是我自己做出来的了。。。。。。
海港-队列
思路:先写一个结构体,用来记录船上乘客的到港时间和国籍;
然后开队列装结构体,船是按照时间顺序入港的,依题意,要在每艘船入港时找出以这艘船为起点的前24小时即86400s(不包括86400)内入港的船上一共有多少国人,具体在代码上解释。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct per
{
int t;//入港时间
int c;//国籍
};
queue<per>x;
int n,t,k,c,ans=0;
int num[N];
int main()
{
struct per tmp;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t>>k;
for(int j=1;j<=k;j++)
{
cin>>c;
x.push({t,c});//一、依次入队每个人的时间和国籍
if(num[c]==0) ans++;//这里需要注意,如果原来是0,说明还没有这国人,但是此人是,所以国籍数+1
num[c]++;//该国人数增加1
}
while(t-x.front().t>=86400)//超过时间就把记录的总国籍人数和国籍数往下减
{
tmp=x.front();
x.pop();
int x1=tmp.c;
num[x1]--;//减人数
if(num[x1]==0) ans--;//人数减没的话,就减国籍数
}
cout<<ans<<endl;
}
return 0;
}
关系网络-队列
思路:还是用结构体,装要搜索的人和步数;再开队列装结构体
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int n,st,en,vis[N],a[N][N];
struct sou
{
int m,ans;//m记录要搜索的编号,ans记录步数
};
queue<sou>x;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>st>>en;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
x.push({st,0});//先把起点入队
vis[st]=1;//标记入队
while(!x.empty())//依次循环来对队首元素搜索
{
int m=x.front().m;
int ans=x.front().ans;
x.pop();//搜索结束要出队
if(m==en)//如果找到了目标,就停止搜索
{
cout<<ans-1<<endl;//题目问的是过程中要认识几个人,所以得-1
break;
}
for(int i=1;i<=n;i++)//寻找每次搜索的人所认识的人,让他们入队
{
if(a[m][i]&&!vis[i])//必须是认识的人,而且是没有入过队的才能入队
{
vis[i]=1;
x.push({i,ans+1});
}
}
}
return 0;
}
Blash数集-队列-set
这题貌似用队列的话要用set,暂时不会,jwGG的题解里没用队列看懂了,跟当时的那个丑数的题思路相同,话不多说,上人家的代码。。。。。。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,x2,x3,a[N];
int main()
{
ios::sync_with_stdio();
cin>>a[1]>>n;
x2=1;//记录*2+1操作的下标
x3=1;//记录*3+1操作的下标
for(int i=2;i<=n;i++)
{
a[i]=min(2*a[x2]+1,3*a[x3]+1);
if(a[i]==2*a[x2]+1) x2++;
if(a[i]==3*a[x3]+1) x3++;
}
cout<<a[n]<<endl;
return 0;
}