luogu p5587 打字練習 題解
眾所周知,這是一篇題解,而且是一篇黃題的題解……
它來自洛谷月賽……但是做的時候題目是不是不太一樣呢 \(qaq\) ?
傳送門點這裡:打字遊戲,筆者寫下這篇題解,希望幫助到更多的人
很明顯思路就是你碰到乙個字元後面帶有'<'就不要這個字元,可以額外開個字串存下,最後複製
但是仔細思考一下,這是不可行的,因為可能有多個『<』連在一起。
如果還按照上面那種方式模擬,個人沒有想到有什麼好的辦法。所以我們可能需要優化一下。
一開始按照上面那種想法打了個 \(50\) 分,才想到是不正確的。
然後我就想到了按照鍊錶的方式,對於一些刪除'<',我們只需要把最前面刪掉的字元跳掉第乙個沒有被刪掉的字元的地方就可以。因此我才用了乙個 \(pre\) 陣列記錄這個刪除最多延伸到哪乙個字元,還有乙個 \(next\) 陣列,作為指標把最前面那個被刪除的直接跳到第乙個沒被刪除的,全部處理完後再進行模擬取字元即可。
很明顯上面這個方案是可行的。具體想想怎麼實現,如何更新 \(pre\) 和 \(next\) 兩個陣列。
下面約定我們每一行的字串從第一位開始,以便操作。
掃瞄每一行 \(i\),首先對於我們碰到的乙個刪除(位置為 \(j\)),可能有幾種情況:
是第乙個 字元,那麼 \(pre[j]=1\),\(next[j]=j+1\)(其實就是\(j=1\))的情況;
不是第乙個字元,但是 \(pre[j-1]\)不為0。這說明前面的刪除是連續的,所以我們要多刪除乙個字元。
那麼怎麼操作呢?其實很簡單,你只要:\(pre[j]=pre[j-1]-1\),\(next[pre[j]]=j+1\)即可。
到這裡就會有人有疑問了,為什麼總是讓 \(next=j+1\)?
那麼我們繼續考慮,如果j+1仍然是刪除,那麼 \(next\) 必定會跳到再下一位,否則 \(j+1\) 即為答案。
但是要注意特判 \(pre[j-1]-1=0\) 的情況,此時應直接賦值為 \(1\)。
不是第乙個字元,且\(pre[j-1]=0\),那麼直接讓 \(pre[j]=j-1,next[pre[j]]=j+1\)即可。
\(code:\)
#includeusing namespace std;
const int n = 1e4 + 10;
string a[n], b[n], x, y;
int next[n], pre[n];
int main()
for(int i = 1; ; i++)
for(int i = 1; i <= n; i++) else if(!pre[j - 1])
pre[j] = j - 1;
next[pre[j]] = j + 1;
flag = 1;
}if(flag == 0)
for(int j = 1; j <= size; j++)
a[i] = x;
}for(int i = 1; i <= n; i++) else if(!pre[j - 1])
pre[j] = j - 1;
next[pre[j]] = j + 1;
flag = 1;
}if(flag == 0)
for(int j = 1; j <= size; j++)
b[i] = x;
}int ans = 0;
for(int i = min(n, m); i; i--)
int t; scanf("%d", &t);
ans = (int)((double)ans * 60.0 / (double) t + 0.5);
printf("%d", ans);
return 0;
}
當然會有更加優秀的寫法,不過我認為個人理解更加重要。
月賽的時候只拿到了 \(50pts\),原因竟是月賽題面說范文裡沒有'<'?
我還有什麼可以說的呢?……
P5587 打字練習
思路 我對字串掌握的並不好,所以這篇文章是借鑑另一位博主寫的,在這裡先感謝洛谷使用者ac duckling 然後,這道題難點是如何讀入以及各種特殊情況的解決,不過相信看完 大家不難理解。博主的快讀函式也很用心,建議直接閱讀博主文章 鏈結裡第乙個解法便是,因為無法單獨檢視 include includ...
洛谷 P5587 打字練習
題目描述 r 君在練習打字。有這樣乙個打字練習 給定乙個范文和輸入框,會根據你的輸入計算準確率和打字速度。可以輸入的字元有小寫字母 空格和 英文句號 輸入字元後,游標也會跟著移動。輸入的文字有多行,r 君可以通過換行鍵來換行,換行後游標移動到下一行的開頭。r 君也可以按退格鍵 為了方便,退格鍵用 表...
LuoguP5652 基礎博弈練習題 博弈
歸納 找規律.如果終點 r 是奇數,那麼 r m 1 r 1 這段區間都是先手必敗.然後我們發現 r m 1 及之前都是偶數的話還是先手比敗,直到遇到乙個奇數,就又變成了先手必勝.那麼,對於乙個奇數字置,其前面第乙個先手必勝位置就是 r m 1 前第乙個奇數字置.對於偶數,我們發現是先手必敗,而其前...