• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            POJ百練 - 1017:裝箱問題

            鏈接:http://poj.grids.cn/practice/1017

            說實話
            這就是個簡單的裝箱子問題,很容易想清楚裝箱子的過程,而且這個過程是滿足貪心算法的,
            所以只需要用代碼模擬整個裝箱子的過程即可,但是這樣真的就足夠了嗎???
            我剛開始就是用代碼模擬這個手動過程了,雖然AC了,但是代碼有150行左右,邏輯也顯得過于復雜了,
            得不償失。。。整個過程是6*6的一個占一個箱子,5*5的也必須一個占一個箱子,但是需要補11個1*1的,
            4*4的也是一個占一個箱子,但是需要補5個2*2的,如果2*2的不足夠,則用1*1的代替,
            3*3的4個占一個箱子,但是會有余數,可能余下1,2,3個3*3的箱子,這個時候必須非情況考慮,
            1個3*3的需要和5個2*2的,7個1*1的組合,2個3*3的需要和3個2*2的,6個1*1的組合,
            3個3*3的需要和1個2*2的,5個1*1的組合,最后考慮9個2*2的裝一個箱子,多余的2*2用1*1的去填充盡量擠滿一個箱子,
            最后36個1*1的裝一個箱子,余下的1*1的也必須占一個箱子。。。
            這個過程說出來已經非常復雜了,更何況用代碼寫,我費了九牛二虎之力才寫出來,WA了一次才AC了...

            代碼:
            #include <stdio.h>
            int main()
            {
                int one, two, three, four, five, six;
                int num = 0;
                
                while (scanf("%d%d%d%d%d%d", &one, &two, &three, &four, &five, &six) == 6)
                {
                    if (one == 0 && two == 0 && three == 0 && four == 0 && five == 0 && six == 0)
                    {
                        break;
                    }
                    
                    num = six;
                    num += five;
                    if (one > five * 11)
                    {
                        one -= five * 11;
                    }
                    else
                    {
                        one = 0;
                    }
                    
                    num += four;
                    if (two > four * 5)
                    {
                        two -= four * 5;
                    }
                    else
                    {
                        if (one > four * 5 * 4 - two * 4)
                        {
                            one -= four * 5 * 4 - two * 4;
                        }
                        else
                        {
                            one = 0;
                        }
                        two = 0;
                    }
                    
                    num += three / 4;
                    three = three % 4;
                    if (three == 1)
                    {
                        if (two > 5)
                        {
                            two -= 5;
                            if (one > 7)
                            {
                                one -= 7;
                            }
                            else
                            {
                                one = 0;
                            }
                        }
                        else
                        {
                            if (one > 27 - two * 4)
                            {
                                one -= 27 - two * 4;
                            }
                            else
                            {
                                one = 0;
                            }
                            two = 0;
                        }
                        ++num;
                    }
                    
                    if (three == 2)
                    {
                        if (two > 3)
                        {
                            two -= 3;
                            if (one > 6)
                            {
                                one -= 6;
                            }
                            else
                            {
                                one = 0;
                            }
                        }
                        else
                        {
                            if (one > 18 - two * 4)
                            {
                                one -= 18 - two * 4;
                            }
                            else
                            {
                                one = 0;
                            }
                            two = 0;
                        }
                        ++num;
                    }
                    
                    if (three == 3)
                    {
                        if (two > 1)
                        {
                            two -= 1;
                            if (one > 5)
                            {
                                one -= 5;
                            }
                            else
                            {
                                one = 0;
                            }
                        }
                        else
                        {
                            if (one > 9 - two * 4)
                            {
                                one -= 9 - two * 4;
                            }
                            else
                            {
                                one = 0;
                            }
                            two = 0;
                        }
                        ++num;
                    }
                    
                    num += two / 9;
                    two = two % 9;
                    if (two)
                    {
                        if (one > 36 - two * 4)
                        {
                            one -= 36 - two * 4;
                        }
                        else
                        {
                            one = 0;
                        }
                        ++num;
                    }
                    
                    num += one / 36;
                    if (one % 36)
                    {
                        ++num;
                    }
                    
                    printf("%d\n", num);
                }
                
                return 0;
            }


            這樣的寫法顯然不好吧。。。首先,余下1,2,3個3*3時候需要填幾個2*2的可以存儲在數組里面,這樣就可以不用寫重復代碼了,
            如果再從整體考慮余下多少個格子,就不用用貪心算法模擬裝箱子的過程了。。。
            代碼如下:
            #include <stdio.h>
            int main()
            {
                int one, two, three, four, five, six;
                int num = 0;
                int twoPlace[4] = {0, 5, 3, 1};
                int remTwo, remOne;
                
                while (scanf("%d%d%d%d%d%d", &one, &two, &three, &four, &five, &six) == 6)
                {
                    if (one == 0 && two == 0 && three == 0 && four == 0 && five == 0 && six == 0)
                    {
                        break;
                    }
                    
                    num = six + five + four + (three + 3) / 4;
                    remTwo = four * 5 + twoPlace[three % 4];
                    if (two > remTwo)
                    {
                        num += (two - remTwo + 8) / 9;
                    }
                    
                    remOne = 36 * num - 36 * six - 25 * five - 16 * four - 9 * three - 4 * two;
                    if (one > remOne)
                    {
                        num += (one - remOne + 35) / 36;
                    }
                    
                    printf("%d\n", num);
                }
                
                return 0;
            }

            posted on 2011-11-08 20:15 yx 閱讀(1938) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告貪心

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久综合给合综合久久| 麻豆精品久久久久久久99蜜桃| 热综合一本伊人久久精品| 999久久久无码国产精品| 日韩AV毛片精品久久久| 国产成人精品久久一区二区三区av | 亚洲第一永久AV网站久久精品男人的天堂AV | 色8激情欧美成人久久综合电| 久久国产一区二区| 欧美精品一区二区精品久久| 久久精品国产99久久久| 国产成人久久精品激情| AV狠狠色丁香婷婷综合久久| 国产V亚洲V天堂无码久久久| 精品综合久久久久久888蜜芽| 麻豆亚洲AV永久无码精品久久| 日产精品久久久久久久| 精品久久亚洲中文无码| 久久久久免费看成人影片| 国产精品视频久久久| 亚洲国产精品久久66| 久久精品国产精品亜洲毛片 | 曰曰摸天天摸人人看久久久| 国产午夜电影久久| 欧美一区二区久久精品| 伊人久久大香线蕉av不卡 | 精品国产一区二区三区久久| 欧美亚洲国产精品久久蜜芽| 久久激情亚洲精品无码?V| 一本大道久久香蕉成人网| 婷婷五月深深久久精品| 99久久免费国产精品| 国产激情久久久久久熟女老人| 久久久久无码精品国产| 久久精品国产精品亚洲| 男女久久久国产一区二区三区| 美女写真久久影院| 久久久国产精华液| 999久久久国产精品| 亚洲国产精品无码久久久不卡| 国产伊人久久|