1.G : 排队援救

Time Limit: 1 Sec     Memory Limit: 128 Mb


Description

突发重大灾难,n个人陷入困境,有一个救援点需要人们排队准备接受救援,假设每个人有一个名望值,进队规则如下:

  • 第一个人直接进队;
  • 当队里已经有人时,新来的人发现队尾的人的名望值比自己大或者相等,他会选择离开去其他救援点;
  • 队伍最多5人,如果一个人要进队时,发现队伍已满,而且他的名望值比队尾的人大,他会选择把队首的人挤掉而继续排在队尾。

问最后得到救援的人分别是谁。

Input

单组数据。

第一行为n(1 ≤ n ≤ 100),n为正整数。

第二行为n个人的名望值,第i个去排队的人的名望值为ai (1 ≤ ai ≤ 232 - 1),且为正整数。

Output

按顺序输出最后得到救援的人的号码,一个人号码是多少即为他是第几个去排队的。

Sample Input

6
1 3 5 7 9 11

Sample Output

2 3 4 5 6 

代码实现

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define ll long long

int n;
int a[101];
queue<int>p;
queue<int>no;

/*
使用两个队列实现名望比较(p)&&序号存储(no)
注意队列为空的情况
注意即使队列未满,名望比队尾小的人照样不进入队列
*/

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		if (p.empty() || a[i] > p.back())
		{
			p.push(a[i]);
			no.push(i);
		}
		if (p.size() > 5)
		{
			p.pop();
			no.pop();
		}
	}
	while (!p.empty())
	{
		printf("%d ", no.front());
		no.pop();
		p.pop();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值