过桥问题。有N(N≥2)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有1个手电筒),每次最多两个人一起过桥(否则桥会垮)。N个人的过桥时间依次存入数组t[N]中,分别为:t[0], t[1], ……, t[N-1]。过桥的速度以慢的人为准!注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间。
有多组测试数据,
每组数据先输入一个人数N,然后输入这N个人过桥所花的时间。
输出对应的最短时间。
4 1 2 5 104 5 2 10 1
17
17
思路:
#include <iostream> #include<cstdio> #include<algorithm> using namespace std; int str[10005]; int main() { int n,i; while(scanf("%d",&n)==1) { int sum=0; for(int i=0;i<n;i++) scanf("%d",&str[i]); sort(str,str+n); while(n>=4) { if(2*str[0]+str[n-1]+str[n-2]>2*str[1]+str[0]+str[n-1]) sum+=2*str[1]+str[0]+str[n-1]; else sum+=2*str[0]+str[n-1]+str[n-2]; n-=2; } if(n==3) sum+=str[0]+str[1]+str[2]; else if(n==2) sum+=str[1]; else sum+=str[0]; printf("%d\n",sum); } }