过河问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
-
输入
-
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
- 输出所有人都过河需要用的最少时间 样例输入
-
1 4 1 2 5 10
样例输出
-
17
冷静分析:贪心思想:怎么贪怎么来
这道题的被一个坑点卡了一会,但是基本来说还是不难的,首先要考虑到各种小坑,如一个,两个人过河时,最后再看3个人以上过河时,要思考是①最小的来回跑带一个人快,还是②2个小的先过,然后一个把手电筒运回去,让两个最大的一起过,然后小的在过去,OK,坑点到了,我被坑的就是我把他们整体用单独一种想法算了一遍,然后比较再输出,发现样例过了,但是WA,正确是这样:4个人以上时每两个最大的用①快,还是②快,所以在计算时间的过程中①要每两个最大的都判断一遍。这样才够贪,对吧!!!
代码如下:
01.
#include <stdio.h>
02.
#include <string.h>
03.
#include <algorithm>
04.
#include <math.h>
05.
using
namespace
std;
06.
int
main()
07.
{
08.
int
i,m,n,ans;
09.
int
a[1003];
10.
scanf
(
"%d"
,&n);
11.
while
(n--)
12.
{
13.
scanf
(
"%d"
,&m);
14.
for
(i=1; i<=m; i++)
15.
scanf
(
"%d"
,&a[i]);
16.
sort(a+1,a+1+m);
17.
if
(m==1) //一个人时
18.
{
19.
printf
(
"%d\n"
,a[1]);
20.
continue
;
21.
}
22.
else
23.
ans=a[2];
24.
while
(m>3)
25.
{
26.
ans+=min(a[m]+2*a[2]+a[1],a[m]+a[m-1]+2*a[1]);//比较最大的两个人哪种快一点
27.
m-=2;
28.
}
29.
if
(m==3)
30.
ans+=a[1]+a[3];
31.
printf
(
"%d\n"
,ans);
32.
}
33.
return
0;
34.
}
-
第一行是一个整数T(1<=T<=20)表示测试数据的组数