Codeforces Global Round 11 B. Chess Cheater (貪心,結構體排序)
阿新 • • 發佈:2020-11-04
-
題意:你和朋友進行了\(n\)個回合的棋藝切磋,沒有平局,每次要麼輸要麼贏,每次贏可以得一分,假如前一局也贏了,那麼可以得兩分,結果已成定局,但是你確可以作弊,最多修改\(k\)個回合的結果,問你作弊後最多可以得多少分.
-
題解:假如有\(WLW\),我們讓中間的\(L\)變成\(W\),那麼就能得到\(5\)分,貪心,然後發現,優先讓兩個\(W\)中間的\(L\)變為\(W\)是最優的,我們可以求所有兩個\(W\)之間\(L\)的數量並且記錄位置,然後按數量排序,先讓含\(L\)數量小的變成\(W\),全部改完後\(k\)可能還會有剩餘,再優先將\(W\)的相鄰的\(L\)變成\(W\)
-
程式碼:
struct misaka{ int pos; int val; bool operator < (const misaka & mikoto) const{ return val<mikoto.val; } }e; int t; int n,k; string s; vector<misaka> v; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>t; while(t--){ cin>>n>>k; cin>>s; v.clear(); int len=(int)s.size(); int l=0,r=0; while(l<len && s[l]=='L') l++; r=l; while(r<len){ while(r<len && s[r]=='W') r++; if(r>=len) break; l=r-1; while(r<len && s[r]=='L') r++; if(r>=len) break; e.pos=l+1; e.val=r-l-1; v.pb(e); } sort(v.begin(),v.end()); for(auto o : v){ int p=o.pos; while(s[p]=='L' && k){ k--; s[p]='W'; p++; } } for(int i=0;i<len;++i){ if(s[i]=='W' && k){ if(s[i+1]=='L') {s[i+1]='W';k--;} } } for(int i=len-1;i>=0;--i){ if(s[i]=='W' && k){ if(s[i-1]=='L') {s[i-1]='W';k--;} } } for(int i=0;i<len;++i){ if(s[i]=='L' && k){ s[i]='W'; k--; } } int ans=0; for(int i=0;i<len;++i){ if(s[i]=='W'){ if(s[i-1]=='W') ans+=2; else ans++; } } cout<<ans<<'\n'; } return 0; }