1 条题解

  • 4
    @ 2024-6-28 15:07:12
    • 很明显,能删的要立刻删,它们会阻碍交换。
    • 一共要删除 nn 列,这需要 nn 点体力。
    • 由于删除时总要保证两列字符一致,故两列 X 的个数要相等。设两列 X 的个数原来相差 bb 个,则交换一行 XZ(或 ZX)会使得某一列减少一个 X,而另一列增加一个 X,差值减少 22,故这需要 b2\dfrac{b}{2}​ 点体力。
    • 由样例 11 可知,删除两行相邻的 XZZX 需要 11 点额外体力(删除所需的体力已经计算过了)。上一步完成后,ZXXZ 一定都存在(否则两列 X 的个数不可能相同),因此总会有两行相邻的 XZZX。设上一步结束后还剩下 cc 列,则这需要 c2\dfrac{c}{2}​ 点体力。
    #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;
    }
    
    • 1

    信息

    ID
    2
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    35
    已通过
    7
    上传者