• <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)  編輯 收藏 引用 所屬分類: 解題報告貪心

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久人人爽人人爽人人爽| 国产精品久久久久9999高清| 人人狠狠综合久久亚洲88| 91精品国产高清久久久久久91| 国产精品免费久久久久影院| 伊人久久精品影院| 国产69精品久久久久9999| 久久久久亚洲AV无码观看| 日本免费一区二区久久人人澡| 中文精品99久久国产| 久久综合久久久| 久久精品人人做人人爽97 | 久久久久久无码Av成人影院| 久久青草国产手机看片福利盒子| 日韩中文久久| 国内精品伊人久久久久影院对白| 亚洲va久久久噜噜噜久久天堂| 国产福利电影一区二区三区久久老子无码午夜伦不 | 色欲av伊人久久大香线蕉影院 | 国产午夜精品久久久久九九电影| 久久无码高潮喷水| 精品久久国产一区二区三区香蕉| 欧洲人妻丰满av无码久久不卡| 久久精品综合一区二区三区| 国产精品久久久久久久久鸭| 国产一区二区久久久| 一本久久精品一区二区| 久久婷婷人人澡人人| 国产精品激情综合久久| 麻豆精品久久久一区二区| 久久国产亚洲高清观看| www性久久久com| 2020久久精品国产免费| 亚洲AV无一区二区三区久久 | 久久精品一本到99热免费| 一本大道久久东京热无码AV| 内射无码专区久久亚洲| 亚洲国产成人久久综合一区77| 久久综合伊人77777麻豆| 狠狠色综合网站久久久久久久| 国产精品99久久久久久www|