範例輸入都沒問題,但第一筆測資就錯了,答案是4,我輸出2
字串長度19,k=1,但我想辦法把前12個字元偷出來自己執行就已經得到4了
總不可能max會愈來愈少吧
code:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int k;
string s;
cin >> k >> s;
int ans = 0;//答案/k
bool need = isupper(s[0]);//"預期"的大小寫
int cnt = k;//還需要符合?個
int gain = 0;//當下累積交錯字串長度/k
for (int i = 0; i < s.size(); i++) {
if (isupper(s[i]) != need) {//與預期不符
need = isupper(s[i]);
gain = 0;
cnt = k;
for (int j = 1; j < k && i - j >= 0; j++) {//往回尋找符合條件的 (EX:AAA,k=2 讓第3個A準備好切換)
if (isupper(s[i - j]) == need) {
cnt--;
}
}
}
if (!--cnt) {//切換預期的大小寫並更新答案
cnt = k; gain++;
need = !need;
ans = max(ans, gain);
}
}
cout << ans*k;
}
範例三就錯了啊
範例三就錯了啊
沒阿,我執行是8沒錯欸
bool need = isupper(s[0]);//"預期"的大小寫
if (isupper(s[i]) != need) {//與預期不符
你的程式在不同系統、編譯器上執行的結果會不一樣,所以M_SQRT說的其實也沒錯,在我的電腦上範例三會輸出2。
isupper回傳的類型是int,小寫回傳0,大寫回傳非0的數值。你的need會轉換為bool,之後與isupper(s[i])比較時再轉為int。我的電腦上大寫回傳255,轉為bool再轉int會變成1,再與isupper(s[i])回傳的255比較會變成false,造成錯誤。但我測試其他系統發現它的isupper大寫會回傳1,轉換後數值不變,所以測資三的輸出是正確的。
解決方法:isupper(s[i]) != need改成(bool)isupper(s[i]) != need
bool need = isupper(s[0]);//"預期"的大小寫
if (isupper(s[i]) != need) {//與預期不符我的電腦上大寫回傳255
更正,回傳256,編譯器是g++ 13.2.1與clang 16.0.6