题目链接

 

题目大意:

公交车有n排座位,每排的座位有两个,且这两个座位的宽度一样。任何两排座位的宽度度都不一样。

首先给你一个n,接下来给你n个数字代表第i排座位的宽度。然后给你一个01字符串代表乘客上车的

顺序。0和1分别代表内向的人和外向的人。内向的人会从没有人坐的那几排选出一个宽度最小的那排

座。外向的人会从有一个人坐的那几排选出宽度最大的那排座。

题目要求你根据上车的顺序输出他们应该坐第几排。

解题思路:

我们如果只考虑内向的人,发现内向人的选择只跟上车顺序和座位的宽度有关。

观察外向的人,我们发现外向的人会从内向人的座位挑出一个宽度最大的坐,如果不存在这样的座位,就

挑选出当前座位宽度最大的坐。

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
#define mmset(a,b) memset(a,b,sizeof(a))
using namespace std;

const int INF = 2e6 + 5;

struct node
{
	int w, flag,id;	
};

bool cmp(node a, node b)
{
	return a.w < b.w;
};
node data[INF];
char str[INF];
/*
2
3 1
0011
outputCopy
2 1 1 2 
inputCopy
6
10 8 9 11 13 5
010010011101
outputCopy
6 6 2 3 3 1 4 4 1 2 5 5 
*/
int main()
{
	int n;
	scanf("%d",&n);
	for(int i = 1; i <= n; i++)
	{
		scanf("%d",&data[i].w);
		data[i].id = i;
		data[i].flag = 0;
	}
	sort(data + 1, data + 1 + n, cmp);
	scanf("%s",str + 1);
	int len = strlen(str + 1);
	int p0 = 1;
	int p1 = len;
	stack <int> sta;
	for(int i = 1; i <= len; i++)
	{
		if(str[i] == '0')
		{
				sta.push(p0);
				printf("%d ",data[p0].id) ;
				p0++;
		}
		else
		{
			if(sta.empty())
			{
				printf("%d ",data[p1].id);
				p1--;
			}
			else
			{
				int temp = sta.top();
				sta.pop();
				printf("%d ",data[temp].id);
			}
		}
	}
	
	
	
	
	
	
	return 0;
}