1. 程式人生 > 實用技巧 >Codeforces Global Round 11 B. Chess Cheater (貪心,結構體排序)

Codeforces Global Round 11 B. Chess Cheater (貪心,結構體排序)

  • 題意:你和朋友進行了\(n\)個回合的棋藝切磋,沒有平局,每次要麼輸要麼贏,每次贏可以得一分,假如前一局也贏了,那麼可以得兩分,結果已成定局,但是你確可以作弊,最多修改\(k\)個回合的結果,問你作弊後最多可以得多少分.

  • 題解:假如有\(WLW\),我們讓中間的\(L\)變成\(W\),那麼就能得到\(5\)分,貪心,然後發現,優先讓兩個\(W\)中間的\(L\)變為\(W\)是最優的,我們可以求所有兩個\(W\)之間\(L\)的數量並且記錄位置,然後按數量排序,先讓含\(L\)數量小的變成\(W\),全部改完後\(k\)可能還會有剩餘,再優先將\(W\)的相鄰的\(L\)變成\(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;
    }