1. 程式人生 > >poj入門水題整理13

poj入門水題整理13

1.2056 Tiling

解釋:有多少種方法可以用2*1和2*2的瓷磚將2*n的地方貼滿

解法:簡單點,就是遞迴啊遞迴,如果長度少一,只能用2*1的瓷磚豎著貼,如果長度少2,則可以用2*2和2種2*1的方式貼上,但是豎著 2塊2*1其實是包含在了T(n-1)的情況中了。

所以公式就是T(n)=T(n-1)+2*T(n-2)

2.3982  序列

解釋:給定An = An-1 + An-2 + An-3這個公式,給定A0, A1 和 A2, 計算A99。

解法:你可以直接遞迴,當然也可以計算出一個公式,A99和A0,A1,A2之間的關係是固定的,直接輸入就可以得到值了。

3.1844 Sum

解釋:將1到N中的所有數進行加減可以得到一個和S,給定一個S,問:為了得到S最小的N是多少,注意,要把N內所有的自然數都用上。

解法:1)最基礎的是1-N的和sum要大於S

            2)其次,1-N的和sum和S的奇偶性要一致,因為無論將哪一個數從+變為-都會少一個偶數,奇偶性不一致的一定不可能。

            3)當sum和S的奇偶性一致之後,這樣是不是就可以了呢?當然是可以的,挑選1-N之間的數可以拼湊成任意小於sum的數。所以sum和S之間的差距是可以解決的。

4.3173 Parkside's Triangle

解釋:給定一個大小N,開始的數字S,讓你輸出一個N為邊長的三角形,以S開始,然後豎著擺放,擺到9再從1開始,讓你輸出這個影象。

解法:就是一個N*N的矩陣,下半部分是為空的,上半部分是數字,以下圖為例:

3 4 6 9 4
  5 7 1 5
    8 2 6
      3 7
        8
第一行,S=3開始,第二列,s+1,第三列s+1+2,第四列s+1+2+3,

第一行 k=S;for(i=0;i<N-1;i++){k+=i;k%=9;cout<<k<<" "};cout<<k+N-1<<endl;注意格式

第二行,先輸出一個空格,第二列,從S+1+1開始,第三列S+1+1+2,第四列(S+2+2+3)%9.

第二行 k=S+1;for(i=0;i<N-1;i++){k+=i;k%=9;cout<<k<<" "};

cout<<k+N-1<<endl;注意格式

也就是說每一行的輸出程式碼都一樣,每一行的開始的數都是遞增的,每一行開始的空格也都是遞增的。

再寫個大迴圈套在外面即可。

5.2080 Calendar

解釋:如題,日曆題。輸入從 公立2000年1月1號開始的天數,需要輸出年月日以及當天是星期幾。

            注意:(年份%400==0)||(年份%4==0 && 年份%100!=0) 的是閏年

解法:星期幾非常好確定,直接%7就可以得到對應的結果了。用一個數組存一下對應是周幾就好了。

            再用一個數組存一下每個月的月份,減去年份對應的天數,不夠時減去月份對應的天數,最後剩下的就是對應的日期數,自己稍微模擬一下就OK了。

6.1008 Maya Calendar

解釋:和上題一樣,是個日曆題,講的是瑪雅文明下用的日曆。一種是365天的Haab,前18個月是20天,分別是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu,月份有名稱,但是日子沒有名字,是按照0-19來表示的,最後一個月是Haab,因為瑪雅人認為這個月不吉利,所以只有5天,分別是0-4。

另一種日曆方式Tzolkin是將時間分為13個時間段,每個時間段20天,分別叫:imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau,每天由一對數構成,由這20個名字和13個1-13的數迴圈組成。(感覺類似我國以前的天干地支),舉例就是1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau, and again in the next period 8 imix, 9 ik, 10 akbal . . . 

兩個日曆的年份都是從0開始的,所以世界的第一天用2種日曆表示就是:

Haab: 0. pop 0
Tzolkin: 1 imix 0

現在要你寫個程式,將Haab日曆轉換為Tzolkin日曆。

解法:用兩個陣列存下名字,參照上題就可以了,然後細心點就可以了。

7.2361 Tic Tac Toe

解釋:一個3*3的方陣,X先行放個X,O後行,放O,橫著、豎著、斜著連著3子就贏了。給出一個3*3的圖形,讓你判斷是否是這個遊戲的其中一種狀態。

解法:1)首先O的個數不能比X多,X的個數不能大於O的個數+1

            2)其次不能兩者都是贏了的狀態,這點很重要。

            3)X贏了的時候,個數要比O的個數多一個,O贏的時候,個數要和X的個數一樣。

8.3075 Tic-Tac-Toe

解釋:和上題一樣,只不過輸入將3*3的矩陣變成一行1*9的輸入了,也是讓你判斷是否是這個遊戲的狀態,輸出變為invalid和valid

9.1218 THE DRUNK JAILER

解釋:一個監獄官,喝第一杯酒,把所有監獄的門開啟,再喝一杯酒把2倍數的門關上,喝第三杯的時候,將3的倍數,如果開著的話就關上,如果關上的話就開啟。直到喝到最後一個監獄。之後監獄裡的逃犯一旦發現門開著就會越獄,需要知道最多會有多少逃犯會逃跑。

解法:舉個例子,6=1*6=2*3,因為6的因子都是成雙成對的,所以6的人是逃不掉的,但4=1*4=2*2,2只能被開啟一次,所以4是可以逃掉的,由此可見,只有完全平方數是可以逃掉的。只要看n之內的完全平方數的個數即可。

10.1804 Brainman

解釋:只通過交換臨近的2個數字,使得2 8 0 3變為升序的序列的最少的次數是3次,變為0 2 3 8

解法:直接一個冒泡演算法,一個變數來計數即可。現在想想,其實可以計算逆序數的個數啊,2803,從2開始,小於2的有1個,然後是8,小於8的有2個,0開始,沒有小於0的,到3,結束。一共是3次。