CF1108D Diverse Garland(題解)
阿新 • • 發佈:2019-02-12
pan 好習慣 比較 using 解釋 urn span color .org
題面:https://www.luogu.org/problemnew/show/CF1108D
咳咳在wzz大佬的提醒下去刷了這道水題,算法思路是貪心。
由於從前往後貪比較麻煩(我看到許多題解大佬都從前往後貪),所以我從後往前貪簡單一些。
也就是說是判s[i]和s[i-1]而不是s[i]和s[i+1]。
下面上代碼(詳解在代碼裏面)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,gs;//n為字符串長度,gs為最少要改的次數。 4 char s[200010]; 5 int main() 6 {7 cin>>n; 8 for(int i=1;i<=n;i++) 9 { 10 cin>>s[i]; 11 }//輸入輸出不解釋 12 for(int i=2;i<=n;i++)//從i=2開始判,否則會卡bug(其實也沒什麽用,看著順眼,不過還是保留這個好習慣,因為有些題會卡)。 13 { 14 if(s[i-1]==s[i])//從s[i]的後面一個與前面的一個比較,這樣貪心比較簡單(主要是容易想,因為我實在是太蒻了) 15 { 16 if(s[i-1]!=‘R‘ && s[i+1]!=‘R‘) 17 { 18 s[i]=‘R‘; 19 gs++; 20 continue; 21 } 22 if(s[i-1]!=‘G‘ && s[i+1]!=‘G‘) 23 { 24 s[i]=‘G‘; 25 gs++; 26 continue; 27 } 28 if(s[i-1]!=‘B‘ && s[i+1]!=‘B‘)//三種情況(也就是R、G、B這三種)的判斷修改,即判即改。 29 { 30 s[i]=‘B‘; 31 gs++;//每次操作都次數加1。 32 continue; 33 } 34 } 35 } 36 cout<<gs<<endl; 37 for(int i=1;i<=n;i++) 38 { 39 cout<<s[i]; 40 } 41 return 0; 42 }
CF1108D Diverse Garland(題解)