【模拟题题解】 性格公交车

题目

题目描述

在一个公交车上,有n排座位,每排座位有2n个座位,有个车站,每个车站上来一个乘客,0表示性格内向乘客, 1表示性格外向乘客, 你的任务是给他们排座位。排座位的要求是:

内向的人总是选择两个座位都是空的一排。在这些空座位排当中,选择一排座位宽度最小的,并占了其中的一个座位;

外向的人总是选择一个内向的人所占的那排座位。在这些座位排当中,选择一排座位宽度最大的,并在其中占据了空位。

现在已知排座位的宽度和个乘客是内向还是外向的,以及乘客上车的顺序,你的任务是输出每一位乘客应该坐哪一排?

输入格式

输入包含三行。

第一行包含一个整数,表示公交车上一共有排座位。

第二行包含用个用空格分开的整数,从左往右依次表示l_{1}l_{2},......,l_{n}的值,分别表示第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 

数据范围

2\leq n\leq10^{^{5}}

1\leq l_{i}\leq10^{9}

所有输入的数字均为整数


思路点拨:

由题,内向者(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--;
		}
	}
}

\textit{}Ac\;code:

#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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值