队列(代码源)

第一题 队列

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int q[N];
int front=1,rear=0;
int main()
{
	int op;cin>>op;
	while(op--)
	{
		string a;cin>>a;
		if(a=="push")
		{
			int idx;cin>>idx;
			q[++rear]=idx;
		}
		else if(a=="query")
		{
			int idx;cin>>idx;
			cout<<q[front+idx-1]<<endl;
		}
		else front++;
		
		
	}
	return 0;
}

第二题 队列练习(又是被卡cin的一天


#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int q[N];
int front=1,rear=0;
int main()
{
	int num,op;
	scanf("%d%d",&num,&op);
	q[++rear]=num;
	while(op--)
	{
		q[++rear]=2*q[front];
		q[++rear]=2*q[front]+1;
		printf("%d\n",q[front]);
		++front;
		
	}
	return 0;
}

第三题 数字统计

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int q[N];
int front=1,rear=0;
int main()
{
	int n,idx;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&idx);
		q[++rear]=idx;
	}
	
	for(int i=1;i<=rear; i++)
	{
		while(q[front]<(q[i]-5)&&front<i) front++;
		if(i==1)
			printf("0 ");
		else printf("%d ",i-front);
	}
	return 0;
}

第四题 排队买票

#include<bits/stdc++.h>
using namespace std;
const int N=1000001;
int a[1001],b[1001],q[N];
int front=1,rear=0;//a数组记录的是每个人的需求 b数组记录的是每个人买票的时间,q队列就是排队 
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);//读入每个人要几张票 
		q[++rear]=i;//队列不一定记录的是票数 也可以是每个人当前的位置 
	}
	
	int cnt = n;//表示还有多少人没有买完票 
	for(int i=1;cnt;i++)
	{
		--a[q[front]];//队头人的需求减一 
		if(!a[q[front]])
			cnt--,b[q[front]]=i;//队头人满足需求 i就是时间 
		else q[++rear]=q[front];//否则的话 第一个人到最后继续排队 
		++front;
	}
	
	for(int i=1;i<=n;i++)
	{
		printf("%d ",b[i]);
	}
}
posted @ 2022-12-11 12:22  Szang  阅读(36)  评论(0编辑  收藏  举报