• <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>

            SRM 146 DIV 2 1000

            Problem Statement

                

            A well-known riddle goes like this: Four people are crossing an old bridge. The bridge cannot hold more than two people at once. It is dark, so they can't walk without a flashlight, and they only have one flashlight! Furthermore, the time needed to cross the bridge varies among the people in the group. For instance, let's say that the people take 1, 2, 5 and 10 minutes to cross the bridge. When people walk together, they always walk at the speed of the slowest person. It is impossible to toss the flashlight across the bridge, so one person always has to go back with the flashlight to the others. What is the minimum amount of time needed to get all the people across the bridge?

            In this instance, the answer is 17. Person number 1 and 2 cross the bridge together, spending 2 minutes. Then person 1 goes back with the flashlight, spending an additional one minute. Then person 3 and 4 cross the bridge together, spending 10 minutes. Person 2 goes back with the flashlight (2 min), and person 1 and 2 cross the bridge together (2 min). This yields a total of 2+1+10+2+2 = 17 minutes spent.

            You want to create a computer program to help you solve new instances of this problem. Given an vector <int> times , where the elements represent the time each person spends on a crossing, your program should return the minimum possible amount of time spent crossing the bridge.

            Definition

                
            Class: BridgeCrossing
            Method: minTime
            Parameters: vector <int>
            Returns: int
            Method signature: int minTime(vector <int> times)
            (be sure your method is public)
                很有意思的一個題目,大概是說有n個人(1<=n<=6)要過一個獨木橋,獨木橋每次最多只能過2個人。過橋必須要燈籠,而且只有一盞燈籠。如果2個人一起過橋,所花時間由那個需要最長時間的人決定。問怎么過橋所需要的時間最短。
                由于題目的數(shù)據(jù)量不是很大,我直接用dfs搜了下所有的情況然后取最小的時間。貌似還有數(shù)學(xué)方法能很輕松的解決,不過還沒想到。
            #include <iostream>
            #include 
            <vector>
            using namespace std;

            class BridgeCrossing{
            public:
                
            int len,time,cross[6],best;
                
            void dfs(int n,bool flash,vector<int> times);
                
            int minTime(vector<int> times);
            }
            ;
            void BridgeCrossing::dfs(int n, bool flash, vector<int> times){
                
            if(n==0){
                    best
            =(best>time)?time:best;
                    
            return;
                }

                
            if(flash){
                    
            for(int i=0;i<len;i++)
                        
            for(int j=i+1;j<len;j++)
                            
            if(cross[i] && cross[j]){
                                cross[i]
            =cross[j]=false;
                                time
            +=max(times[i],times[j]);
                                dfs(n
            -2,!flash,times);
                                time
            -=max(times[i],times[j]);
                                cross[i]
            =cross[j]=true;
                            }

                }

                
            else{
                    
            for(int i=0;i<len;i++)
                        
            if(!cross[i]){
                            cross[i]
            =true;
                            time
            +=times[i];
                            dfs(n
            +1,!flash,times);
                            time
            -=times[i];
                            cross[i]
            =false;
                        }

                }

            }

            int BridgeCrossing::minTime(vector<int> times){
                best
            =INT_MAX;
                len
            =times.size();
                time
            =0;
                
            for(int i=0;i<6;i++) cross[i]=true;
                
            if(len==1) best=times[0];
                
            else dfs(len,true,times);
                
            return best;
            }

            posted on 2009-05-27 00:59 極限定律 閱讀(648) 評論(1)  編輯 收藏 引用 所屬分類: TopCoder

            評論

            # re: SRM 146 DIV 2 1000 2010-03-05 11:05 3214668848

            在劉汝佳的《算法藝術(shù)與信息學(xué)競賽》上貪心算法練習(xí)題有這么一個題,應(yīng)該是貪心可以吧  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            相關(guān)文章:
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2009年4月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(10)

            隨筆分類

            隨筆檔案

            友情鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            伊人情人综合成人久久网小说| 精品久久久久久久无码| 国产高潮国产高潮久久久91 | 久久久久国产一区二区| 久久人人爽人爽人人爽av | 久久精品a亚洲国产v高清不卡| 国产精品久久国产精品99盘 | 99久久精品免费国产大片| 午夜天堂av天堂久久久| 久久99精品国产99久久6男男| 久久免费99精品国产自在现线| 久久天天躁夜夜躁狠狠躁2022| 久久精品国内一区二区三区| 国内精品伊人久久久影院| 久久w5ww成w人免费| 亚洲乱码日产精品a级毛片久久| 国产亚洲欧美精品久久久| 亚州日韩精品专区久久久| 91精品日韩人妻无码久久不卡 | 久久精品国产精品青草| 亚洲国产成人精品女人久久久 | 久久99精品久久只有精品| 亚洲色欲久久久久综合网| 国内精品久久久久国产盗摄| 久久狠狠高潮亚洲精品| 久久亚洲中文字幕精品一区| 久久亚洲精品无码播放| 久久精品无码一区二区日韩AV| 久久综合九色综合欧美狠狠| 人妻无码中文久久久久专区| 狠狠综合久久AV一区二区三区 | 久久se精品一区二区影院| 欧美亚洲国产精品久久蜜芽| 国产精品久久国产精品99盘| 国内精品久久久久久99蜜桃| 久久久久99精品成人片欧美 | 亚洲精品无码成人片久久| 久久丫精品国产亚洲av| 国产成人无码久久久精品一| 久久精品成人免费网站| 国产成人无码精品久久久免费|