Skip to content

M30218: 狭路相逢

stack, http://cs101.openjudge.cn/practice/M30218/

cpp
#include <iostream>
#include <vector>

auto main() -> int {
  std::cin.tie(nullptr)->sync_with_stdio(false);

  int N;
  std::cin >> N;
  std::vector<int> st;

  while (N--) {
    int v;
    std::cin >> v;

    bool flag = true;
    while (flag && v < 0 && !st.empty() && st.back() > 0) {
      if (st.back() < -v)
        v = st.back() + v, st.pop_back();
      else if (st.back() == -v)
        st.pop_back(), flag = false;
      else
        st.back() += v, flag = false;
    }

    if (flag)
      st.push_back(v);
  }

  std::cout << st.size() << '\n';

  for (const auto &a : st)
    std::cout << a << ' ';
  return 0;
}

共用时30min

思路:简单的模拟, 维护两个栈即可. 被输出格式卡了一会, 一开始忘记输出存活总数了

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

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    deque<int> soldiers;
    vector<int> monsters;
    for (int i = 0; i < n; i++) {
        if (a[i] < 0) {
            int monster = -a[i];
            while (!soldiers.empty()) {
                int top = soldiers.back();
                soldiers.pop_back();
                if (top > monster) {
                    soldiers.push_back(top - monster);
                    break;
                } else if (top == monster) {
                    monster = 0;
                    break;
                } else {
                    monster -= top;
                }
            }

            if (soldiers.empty() && monster > 0) {
                monsters.push_back(-monster);
            }
        } else {
            soldiers.push_back(a[i]);
        }
    }

    cout << monsters.size() + soldiers.size() << endl;
    for (int monster : monsters) {
        cout << monster << " ";
    }
    for (int soldier : soldiers) {
        cout << soldier << " ";
    }
    return 0;
}