UVA10037 Bridge

n people wish to cross a bridge at night. A group of at most two people may cross at any time, andeach group must have a flashlight. Only one flashlight is available among the n people, so some sort ofshuttle arrangement must be arranged in order to return the flashlight so that more people may cross.

  Each person has a different crossing speed; the speed of a group is determined by the speed of theslower member. Your job is to determine a strategy that gets all n people across the bridge in theminimum time.

Input

The input begins with a single positive integer on a line by itself indicating the number of the casesfollowing, each of them as described below. This line is followed by a blank line, and there is also ablank line between two consecutive inputs.

  The first line of input contains n, followed by n lines giving the crossing times for each of the people. There are not more than 1000 people and nobody takes more than 100 seconds to cross the bridge.

Output

For each test case, the output must follow the description below. The outputs of two consecutive caseswill be separated by a blank line.

  The first line of output must contain the total number of seconds required for all n people to crossthe bridge. The following lines give a strategy for achieving this time. Each line contains either one ortwo integers, indicating which person or people form the next group to cross. (Each person is indicatedby the crossing time specified in the input. Although many people may have the same crossing timethe ambiguity is of no consequence.)

  Note that the crossings alternate directions, as it is necessary to return the flashlight so that more may cross. If more than one strategy yields the minimal time, any one will do.

Sample Input

1

 

4

1

2

5

10

Sample Output

17

1 2

1

5 10

2

1 2

问题简述;

过桥问题,第一行给出一个数t,表示事例的个数,后边跟着一个空行, 每两个事例中间也有一个空行。然后输入要过桥的人的个数n,接下来的n行,每行为该人过桥所用的时间。输出第一行为过桥所用总时间,后边为每一次过桥的人,用该人的时间来代替人。

思路:

过桥有以下几种可能:

1.一人a过桥,所用时间为a

2.两人a,b过桥,a<b,所用时间为b

3.三人a,b,c过桥,a<b<c,

      ①:a,c先过,所用时间为c

      ②:a返回,所用时间为a

      ③:a,b过桥,所用时间为b      时间总和为a+b+c

4.四人及以上过桥,a<b<……<c<d

   方案一:由最快的a传递手电筒帮助c,d过桥:a带c过,a回来,a再带d过,a回来。所用时间为2*a+c+d,人数减少两个

   方案二:由最快的a和次快的b传递手电筒

       ①:a,b过桥,所用时间为b

       ②:a返回  ,将手电筒给c,d,时间为a

       ③:c,d过桥,所用时间为d,

       ④:b拿手电筒返回,时间为b       时间总和为a+2*b+d,人数减少两个

   当人数减少到<=3,就成了前三种情况

 

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
   int t;
   scanf("%d",&t);
   for(int i=1; i<=t ; i++) {
        int ans=0,a[1005];
        int n;
        if(i!=1)             //注意题目信息,要换行
            printf("\n");
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int m=n;
        while(m>=4){     //注意此处要循环
            ans+=min(2*a[0]+a[m-2]+a[m-1],a[0]+2*a[1]+a[m-1]);
            m-=2;
        }
        if(m==3)
            ans+=a[0]+a[1]+a[2];
        else if(m==2)
            ans+=a[1];
        else if(m==1)
            ans+=a[0];
        printf("%d\n",ans);
        while(n>=4){
            if(2*a[0]+a[n-2]+a[n-1]<a[0]+2*a[1]+a[n-1])
                printf("%d %d\n%d\n%d %d\n%d\n",a[0],a[n-2],a[0],a[0],a[n-1],a[0]);
            else
                printf("%d %d\n%d\n%d %d\n%d\n",a[0],a[1],a[0],a[n-2],a[n-1],a[1]);
                n-=2;
        }
        if(n==3)
            printf("%d %d\n%d\n%d %d\n",a[0],a[2],a[0],a[0],a[1]);
        else if(n==2)
            printf("%d %d\n",a[0],a[1]);
        else if(n==1)
            printf("%d\n",a[0]);
   }


    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值