トピックスアドレス
問題の解決策
本当に半分だと思う... ...タグワードを見ていないことができない
私は、質問となり、二分決定問題に変換する答えを考え、X JOI / IOIの組み合わせをすることができ、後方行うには貪欲決意を、検討し、統計の1数CNTは、OI基はTOTの数を有し、JOI / IOI番号ANS。Jについて明確に直接回答OI組成を探しています。明らかに、Oのための直接I.へ 私は答えのセット現在のCNT + TOT + ANS> = xを想定し、または私はOIの内側に、CNT ++を聞かせないと、貪欲検討する必要があります。(Xは貪欲に一つだけOIを作成する必要が検討し、より多くの廃棄物を作成します)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1000010;
int n;
char s[N];
bool check(int x) {
int ans = 0, tot = 0, cnt = 0;
for(int i = n; i; --i) {
if(x == ans) return 1;
if(s[i] == 'J') {
if(tot) --tot, ++ans;
continue;
}
if(s[i] == 'O') {
if(cnt) --cnt, ++tot;
continue;
}
if(s[i] == 'I') {
if(ans + tot + cnt < x) cnt++;
else {
if(tot) --tot, ++ans;
}
}
}
if(x == ans) return 1;
return 0;
}
int main() {
scanf("%d%s", &n, s + 1);
int l = 0, r = n, ans = 0;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) ans = mid, l = mid + 1;
else r = mid - 1;
}
printf("%d\n", ans);
}