随笔-20  评论-16  文章-36  trackbacks-0

3404 Crossing River

      题目大意是有N个速度未必相同的人划船过河,每次最多载2个人,每次由划的慢的人划,问最短要多久才能将所有人渡过河?设每个人用时从小到大为t[0]、t[1]....t[n-1]、t[n]。
      看到这个问题首先想到的是一个牧人、羊、狼、草过河的问题,可是这里是求最小值,感觉没什么思路,把sample看懂以后就有点清晰了:关键在于用好速度最快和第二快的人。而且很容易想到,一旦速度很慢的渡过了河,就不可能再返程,什么是很慢呢?列个式子,每次考虑送两个人,因为基本策略有两种:一种是最快的人把两个人分别送去再自已回来,另一种是最快和次快的人一起去,把次快的留下用以下一次把船划回,这样可以使两个最慢的人一起过河。感觉讲的抽象点,举sample来说吧,它的策略应当是第二种:
                        1,2-->
                           <--1
                       5,10-->
                           <--2
                        1,2-->
共用17个单位时间,而对于四个人用时为1,2,2,2的情况则应该用第一种策略
                        1,2-->
                           <--1
                        1,2-->
                           <--1
                        1,2-->
共用8个单位时间。(如果用策略2则要用9个单位时间)
      把两次来回即送过去两个人为一次考察对象,很容易得出结论:当a[n-1]+a[0]> 2*a[1]时,采用策略1,否则采用策略2。由此列出下式:再适当处理边界就搞定了!

while( n>= 3 ){
    min
+= (a[0]+a[n]);
    
if( a[n-1]+a[0]> a[1]+a[1] )
        min
+= (a[1]+a[1]);
    
else
        min
+= (a[0]+a[n-1]);
    n
-= 2;
}
posted on 2009-03-31 19:07 古月残辉 阅读(182) 评论(0)  编辑 收藏 引用 所属分类: POJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理