题目
题目描述
在一个公交车上,有n排座位,每排座位有2n个座位,有个车站,每个车站上来一个乘客,0表示性格内向乘客, 1表示性格外向乘客, 你的任务是给他们排座位。排座位的要求是:
内向的人总是选择两个座位都是空的一排。在这些空座位排当中,选择一排座位宽度最小的,并占了其中的一个座位;
外向的人总是选择一个内向的人所占的那排座位。在这些座位排当中,选择一排座位宽度最大的,并在其中占据了空位。
现在已知排座位的宽度和个乘客是内向还是外向的,以及乘客上车的顺序,你的任务是输出每一位乘客应该坐哪一排?
输入格式
输入包含三行。
第一行包含一个整数,表示公交车上一共有排座位。
第二行包含用个用空格分开的整数,从左往右依次表示,
,......,
的值,分别表示第1排座位的长度,第2排座位的长度,……,第n排座位的长度。
第三行包含一个包含个或字符的字符串,其中0表示性格内向乘客,1表示性格外向乘客,而且字符的顺序就是每个乘客上车的顺序。输入数据保证外向乘客的数量等于内向乘客的数量(即两个数量都等于),并且对于每个外向乘客总是有一个合适的排。
输出格式
输出只有一行,包含2n个正整数,分别表示乘客将坐的排号。输出乘客的顺序应与输入的顺序相同。
样例输入1
2
3 1
0011
样例输出1
2 1 1 2
样例输入2
6
10 8 9 11 13 5
010010011101
样例输出2
6 6 2 3 3 1 4 4 1 2 5 5
数据范围
所有输入的数字均为整数
思路点拨:
由题,内向者(0表示)上车必占空座,且宽度最小,外向者(1表示)上车必作0旁(怎么有点不对劲),且宽度最大。可想,用栈和队列来模拟操作。本人习惯数组,所以用数组来模拟。
核心代码:
sort(a+1,a+n+1,cmp);//升序排序
for(int i=1;i<=2*n;i++){
//p:记录0坐到哪了
//q: 记录1坐到哪了
scanf("%c",&l);
if(l=='0'){//0上车
printf("%d ",a[p].bh);
q=p;//更新p,q的位置
p++;
}
else{
printf("%d ",a[q].bh);
v[q]=1;//记录q的位置有无1坐过
while(v[q]==1){//找无1坐的最大宽度位置
q--;
}
}
}
#include<bits/stdc++.h>
using namespace std;
int n,b[400005];
bool v[200005];
struct node{
int bh,s;
}a[200005];
bool cmp(node x,node y){
return x.s<=y.s;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].s);
a[i].bh=i;
}
sort(a+1,a+n+1,cmp);
char l;
int p=1,q=1;
scanf("\n");
for(int i=1;i<=2*n;i++){
scanf("%c",&l);
if(l=='0'){
printf("%d ",a[p].bh);
q=p;
p++;
}
else{
printf("%d ",a[q].bh);
v[q]=1;
while(v[q]==1){
q--;
}
}
}
return 0;
}