洛谷 P3392 塗國旗
阿新 • • 發佈:2017-11-19
targe stream 狀態 -c bar 方法 radi name esp
P3392 塗國旗
題目描述
某國法律規定,只要一個由N*M個小方塊組成的旗幟符合如下規則,就是合法的國旗。(毛熊:阿嚏——)
-
從最上方若幹行(>=1)的格子全部是白色的。
-
接下來若幹行(>=1)的格子全部是藍色的
- 剩下的行(>=1)全部是紅色的
現有一個棋盤狀的破布,分成了N行M列的格子,每個格子是白色藍色紅色之一,小a希望把這個布改成該國國旗,方法是在一些格子上塗顏料,蓋住之前的顏色。
小a很懶,希望塗最少的格子,使這塊破布成為一個合法的國旗。
輸入輸出格式
輸入格式:
第一行是兩個整數,N,M
接下來N行是一個矩陣,矩陣的每一個小方塊是‘W‘(白),‘B‘(藍),‘R‘(紅)中的一個
輸出格式:
一個整數,表示至少需要塗多少塊。
輸入輸出樣例
輸入樣例#1: 復制4 5
WRWRW
BWRWB
WRWRW
RWBWR
輸出樣例#1: 復制
11
說明
樣例解釋:
目標狀態是
WWWWW
BBBBB
RRRRR
RRRRR
一共需要改11個格子
對於100%的數據,N,M<=50
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,ans=0x7f7f7f7f; int sum[51][4]; string s; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ cin>>s; sum[i][0]=sum[i-1][0];sum[i][1]=sum[i-1][1];sum[i][2]=sum[i-1][2];for(int j=0;j<m;j++){ if(s[j]==‘W‘) sum[i][0]++; else if(s[j]==‘B‘) sum[i][1]++; else if(s[j]==‘R‘) sum[i][2]++; } } for(int i=1;i<=n;i++) for(int j=1;j<=n-i;j++) if(n-i-j>0) ans=min(ans,i*m-sum[i][0]+j*m-sum[j+i][1]+sum[i][1]+(n-i-j)*m-sum[n][2]+sum[i+j][2]); cout<<ans; }
洛谷 P3392 塗國旗