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();
}
}