← 返回题目页

A0630 公交车乘客

标程

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<long long> w(n);
    for (int i = 0; i < n; i++) cin >> w[i];
    string s;
    cin >> s;

    // 空排(两座全空)按宽度升序取;半满排(已有一人)按宽度降序取
    vector<int> used(n, 0);
    using P = pair<long long, int>;
    priority_queue<P, vector<P>, greater<P>> emptyQ;
    priority_queue<P> halfQ;
    for (int i = 0; i < n; i++) emptyQ.push({w[i], i});

    vector<int> pick;
    for (char c : s) {
        int row;
        if (c == '0') {
            // 内向者:挑宽度最小的空排
            while (!emptyQ.empty() && used[emptyQ.top().second] != 0) emptyQ.pop();
            row = emptyQ.top().second;
            emptyQ.pop();
            used[row] = 1;
            halfQ.push({w[row], row});
        } else {
            // 外向者:挑宽度最大的半满排
            while (!halfQ.empty() && used[halfQ.top().second] != 1) halfQ.pop();
            row = halfQ.top().second;
            halfQ.pop();
            used[row] = 2;
        }
        pick.push_back(row + 1);
    }

    for (int i = 0; i < (int)pick.size(); i++) {
        if (i) cout << ' ';
        cout << pick[i];
    }
    cout << '\n';
    return 0;
}

动画演示