P8080 [COCI2011-2012#4] KINO 题解

\(N\) 只有 \(50\),所以直接模拟,贪心。

我们可以寻找那些不能使用杯座的人,再反求出能使用杯座的人,而 \(S\) 的两侧各有一个杯座,所以我们只需要考虑 \(L\) 是否能使用杯座。

因为样例有点水,所以先自己列举了几个样例进行研究:

  • \(\texttt{*S *L L* L L* S*}\) :第 \(3\) 个 \(L\) 不能使用杯座。

  • \(\texttt{*S *L L* L L* L L*}\):第 \(3\),\(5\) 个 \(L\) 不能使用杯座。

  • \(\texttt{*L L* L L* L L* L L* S*}\):第 \(3\),\(5\),\(7\) 个 \(L\) 不能使用杯座。

由此发现,再连续的一些 \(L\) 中,第 \(n\) 个 \(L\) 不能使用杯座满足 \(n \not = 1\) 且 \(n\) 为奇数。

还有一种情况,即 \(\texttt{*S *S *L L* S* L L*}\) 中第 \(3\) 个 \(L\) (即第 \(2\) 段连续的 \(L\) 中第 \(1\) 个)不能使用杯座,所以又可以发现当出现 \(\texttt{SLL}\) 的情况且在此之前出现过 \(L\)(如样例 \(2\))时,其中第 \(1\) 个 \(L\) 不能使用杯座。

综上两种情况所述,我们维护两个变量 \(x\),\(y\),\(x\) 用来维护连续的 \(L\) 中第奇数个 \(L\),\(y\) 用来维护情况二中在此之前是否出现过 \(L\)。

最后,上代码!

#include <bits/stdc++.h>
using namespace std;
int n, ans, a, x, y;
string s;
int main() {
    scanf("%d", &n);
    cin >> s;
    for(int i = 0; i < n; i++) {
        ans++;
        if(s[i] != 'L') x = 0;
        else x++, y++;
        if(i > 0 && s[i] == 'L' && s[i - 1] == 'S' && s[i + 1] == 'L' && y != 1) ans--;
        if(x != 1 && x % 2 == 1) ans--;
    }
    printf("%d\n", ans);
    return 0;
}

AC 记录,吸氧实测 \(32ms\)。

上一篇:Azure DevOps for Power Platform - Build Pipeline


下一篇:LaTeX/宏包: caption