过河问题

/*在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不
借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共
只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的
话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得
比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让
这N人尽快过桥。 


输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
输出所有人都过河需要用的最少时间*/








#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAX = 1010;
int Speed[MAX];
int main()
{
int n, pnum, last, total;
cin >> n;
while (n--)
{
total = 0;
cin >> pnum;
last = pnum - 1;
for (int i = 0; i != pnum; ++i)
{
cin>>Speed[i];
}
sort(Speed, Speed + pnum);
if (pnum == 1) cout << Speed[0] << endl;
else
{
while (last >= 2)
{
if (last >= 3)

{

//每次只送两个人过去

if (Speed[last - 1] + Speed[0]>Speed[1] * 2) //如果时间相差不大的时候就会出现这样的情况,也就是最快的那个人比第二块的人快很多的时候会这样。
total += Speed[last] + Speed[0] + 2 * Speed[1];
else total += Speed[0] * 2 + Speed[last - 1] + Speed[last];
last -= 2;
}
else if (last == 2)
{
total += Speed[0] + Speed[last]; //最后两个时,有最快的送过去再过来,再和次快的一起过去。
break;
}
}
total += Speed[1];
cout << total << endl;
}
}
}


/*
假设m个排序的过桥时间:a0,a1,a2,a3,a4......am-1
已知条件:最后一步肯定是a0和a1一起过去,所以所花的时间初始化sum=a[1]


过河两种方法,每次过两个人(所以需要m-=2):
1.a0和a1过去,a0回来,am-2和am-1过去,a1回来,所花时间sum+=a[1]+a[0]+a[m-1]+a[1]
2.a0和am-1过去,a0回来和am-2过去,a0再回来,所花时间sum+=a[m-1]+a[0]+a[m-2]+a[0]


最后只有2种情况:如果m为奇数则剩3个人,如果m为偶数则剩2个人
由于前面初始化sum=a[1],所以只需考虑3个人时a0将a2送过去再回来的所花的额外时间sum+=a[2]+a[0]
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值