查看: 1560|回復: 0
打印 上一主題 下一主題

[ZJ] a888 - C. 混色模式 (NPSC2013 國中組初賽)

[複製鏈接]
  • TA的每日心情
    開心
    2015-4-12 10:09
  • 簽到天數: 137 天

    [LV.7]常住居民III

    142

    主題

    686

    帖子

    3559

    積分

    邁向天堂

    蘇多門

    Rank: 8Rank: 8

    積分
    3559

    新手達陣台南一中資訊社程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-11-25 15:41:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 domen111 於 2014-11-25 16:02 編輯

    之前一直覺得好難(可能是因為我一直推Sigma的公式的關係吧),今天頭腦突然想通了就覺得好像也沒多難

    基本的上的想法是線性搜尋中間線(紅線),將長方形切割成左右兩部分,左右兩部分分別求出方法數,相乘就是答案了。

        (圖一)

    問題: 不會有左右交叉的問題嗎? 如圖二
    這就是我之前一直糾結很久的問題,事實上其實只要中間線切割的是長方形的長邊就不會有這個問題,所以第16行寫個判斷就一切解決。

        (圖二)

    好了,既然我們現在已經有了基本的想法,那麼下一步就是求左邊和右邊有多少種方法
    左半部:
    我們定義左半部較大的那塊正方形一定要貼齊中間線,否則可能會有重複計算的問題(假設左右半部都沒有貼齊中間線,可能同種情形不同中間線都會算到)
    首先我們假設左上角的正方形>=左下角的正方形,既然一定要貼齊中間線,表示已經確定左上角的大小,那麼計算左下角的正方形有幾種方法數就ok了。
    注意(我一開始寫出的小bug): 第21行,如果已經不可能貼齊中間線了就break
    右半部:
    比左半部複雜一些,自己推一下公式,我的code的解法用cal的function去計算,不過事實上不用那麼麻煩,因為我的cal function是支援兩個方形上限大小不同的情形 (那是我之前在想一個很複雜的作法時推出的公式)

    遊客,如果您要查看本帖隱藏內容請回復

    蘇多門 domen111
    My Web: https://sites.google.com/site/domenprg/
    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表