logo AlgoBeat OnlineJudge
登录 注册

Official Editorial

作者: 035966_L3  ·  发布于 2026-06-14 20:40:46  ·  最后修改于 2026-06-14 20:53:17
已通过
审核员:joe_zxq 彩笔 · 2026-06-14 20:53:17

https://scg3.piaoztsdy.cn/p/16

  • 很明显,能移除的要立刻移除,它们会阻碍交换。
  • 一共要移除 张床,这需要 点体力。
  • 由于删除时总要保证上下铺人员类型一致,故上下铺 X 的个数要相等。设上下铺 X 的个数原来相差 个,则交换一个 XZ(或 ZX)会使得某一边减少一个 X,而另一边增加一个 X,差值减少 ,故这需要 ​ 点体力。
  • 由样例 可知,删除两个相邻的 XZZX 需要 点额外体力(删除所需的体力已经计算过了)。上一步完成后,ZXXZ 一定都存在(否则两列 X 的个数不可能相同),因此总会有两行相邻的 XZZX。设上一步结束后还剩下 列,则这需要 ​ 点体力。
#include <bits/stdc++.h>
using namespace std;
int main()
{
    freopen("pairs.in", "r", stdin);
    freopen("pairs.out", "w", stdout);
    int n;
    cin >> n;
    int b = 0, c = 0;
    for (int i = 1; i <= n; i++)
    {
        string s;
        cin >> s;
        if (s == "XZ") b++, c++;
        if (s == "ZX") b--, c++;
    }
    int a = n + abs(b) / 2 + c / 2;
    cout << a << endl;
    return 0;
}

暂无评论

登录 后即可评论。