Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ đếm tối thiểu bao nhiêu phút sau sẽ không có học sinh mới tức giận

Giả sử chúng ta có một chuỗi S có độ dài n, chỉ có hai loại ký tự là 'A' hoặc 'P'. Có n học sinh liên tiếp, học sinh thứ i tức giận nếu S [i] ='A', nếu là 'P' thì S [i] là người kiên nhẫn. Một học sinh tức giận ở chỉ số i sẽ đánh học sinh kiên nhẫn ở chỉ số i + 1 trong mỗi phút, và đối với học sinh cuối cùng dù tức giận, anh ta cũng không thể đánh ai. Sau khi đánh một học sinh kiên nhẫn, học sinh đó cũng tức giận. Chúng tôi phải tìm những phút tối thiểu để sau đó không có học sinh mới nào nổi giận.

Vì vậy, nếu đầu vào là S ="PPAPP", thì đầu ra sẽ là 2, vì sau phút đầu tiên, chuỗi sẽ là "PPAAP", sau đó đến phút thứ hai là "PPAAA", sau đó không có học viên mới nào nổi giận nữa.

Các bước

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

n := size of S
ans := 0, cnt = 0
for initialize i := n - 1, when i >= 0, update (decrease i by 1), do:
   if S[i] is same as 'P', then:
      (increase cnt by 1)
   Otherwise
      ans := maximum of ans and cnt
      cnt := 0
return ans

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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

int solve(string S) {
   int n = S.size();
   int ans = 0, cnt = 0;
   for (int i = n - 1; i >= 0; i--) {
      if (S[i] == 'P') {
         cnt++;
      } else {
         ans = max(ans, cnt);
         cnt = 0;
      }
   }
   return ans;
}
int main() {
   string S = "PPAPP";
   cout << solve(S) << endl;
}

Đầu vào

PPAPP

Đầu ra

2