1. 程式人生 > >CF1108D Diverse Garland(題解)

CF1108D Diverse Garland(題解)

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(題解)