题目大意:
公交车有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;
}