1. 程式人生 > >POJ 3185 - The Water Bowls

POJ 3185 - The Water Bowls

esp int blog step names 網上 include [1] clu

據網上傳聞,用高斯消元解?(我就是在學高斯消元的時候看到有拿這個題當練手題的)

但是,看到discuss上有人說根本不用什麽高斯消元和搜索,我一想也是……這題顯然用貪心啊……

首先前提:翻轉問題,1、每個碗只有主動翻轉一次和不主動翻轉兩種情況;2、主動翻轉碗的順序對結果沒有影響。

於是我們的思路是,強制按照從左到右這個順序翻碗碗,

那麽,如果有個bowl[i]是1(並且bowl[1]……bowl[i-1]都已經是0),我們要把他變成0,只能翻bowl[i+1],否則,若是我們翻bowl[i],就會影響到bowl[i-1],由於我們強制按照從左到右翻碗,那麽這樣的情況是不能接受的。

於是,我們就有大體思路,從左到右,枚舉每個碗bowl[i],根據bowl[i-1]的情況看他應不應該主動翻轉,

當然,由於bowl[1]比較特殊,因為沒有bowl[0],所以我們可以分情況試一下翻和不翻bowl[1]兩種情況,分別記錄step,最後輸出小的那個即可。

(題目給的測試用例應該都是可以翻到最後,全翻成0的,所以不考慮impossible的情況)

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int tmp[23],bowl[23],step1=0,step2=0;
 5 void flip(int x){for(int i=x-1;i<=x+1;i++) bowl[i]=!bowl[i];}
6 int main() 7 { 8 for(int i=1;i<=20;i++) {scanf("%d",&tmp[i]);bowl[i]=tmp[i];} 9 10 for(int i=2;i<=20;i++) 11 { 12 if(bowl[i-1]) 13 { 14 flip(i); 15 step1++; 16 } 17 } 18 19 for(int i=1;i<=20;i++) bowl[i]=tmp[i];
20 flip(1);step2++; 21 for(int i=2;i<=20;i++) 22 { 23 if(bowl[i-1]) 24 { 25 flip(i); 26 step2++; 27 } 28 } 29 30 printf("%d\n",min(step1,step2)); 31 }

總的來說,是一道比較水的問題。

POJ 3185 - The Water Bowls