花落知多少sdvl5 题解分享 · 2026/3/7
题解
```cpp #include <bits/stdc++.h> using namespace std; #define ll long long int main() { string s; if (!(cin >> s)) return 0; int ans = 0; int lzone = 0, mzone = 0, szone = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == 'L') lzone++; else if (s[i] == 'M') mzone++; else szone++; } int lstart = 0, lend = lzone - 1; int mstart = lzone, mend = lzone + mzone - 1; int sstart = lzone + mzone, send = (int)s.length() - 1; int minl = 0, sinl = 0, linm = 0, sinm = 0, lins = 0, mins = 0; for (int i = lstart; i <= lend; i++) { if (s[i] == 'M') minl++; else if (s[i] == 'S') sinl++; } for (int i = mstart; i <= mend; i++) { if (s[i] == 'L') linm++; else if (s[i] == 'S') sinm++; } for (int i = sstart; i <= send; i++) { if (s[i] == 'M') mins++; else if (s[i] == 'L') lins++; } ans += min(lins, sinl) + min(linm, minl) + min(sinm, mins); // 每三本形成一个环的书需要两次交换 ans += (abs(lins - sinl) + abs(linm - minl) + abs(sinm - mins)) / 3 * 2; cout << ans; return 0; } ``` 本质上就是先按L,M,S分块,本来在对应块里的不用动,优先换互相占了对方位置的书,这样换一次就能使两本书到对应位置,剩下的书每三本成环,每个环要交换两次
查看全文
1 0 0 26