时间限制:1000 ms | 内存限制:65535 KB
难度:5
输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数 每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河 每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
输出所有人都过河需要用的最少时间
样例输入
1 4 1 2 5 10样例输出
17思路:有两种贪心方法第一种是:让跑的最快的人把跑的最慢送到对岸再返回,继续送次最慢的。
第二种让跑的最快的和第二块的先到对岸,第一快的返回,最慢的和第二慢的到对岸,第二快的拿灯返回,
继续按这个规律过河。
(2*s[1]+s[0]+s[n-1] 与 s[0]+s[n-1]+s[n-2])比较。=》 2*s[1] 与 s[0]+s[n-2]
说白了就是看看让最慢的两个人过河,哪一种用的时间少就用哪一种
#include <stdio.h> #include <algorithm> int main() { using namespace std; int t,n; int s[1005]; scanf("%d",&t); while(t--) { int sum = 0; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&s[i]); } sort(s,s+n); while(n >= 4) { if(2*s[1] > s[0]+s[n-2]) { sum += 2*s[0]+s[n-1]+s[n-2]; } else { sum += 2*s[1]+s[0]+s[n-1]; } n -= 2; } if(n==3) { sum += s[0]+s[1]+s[2]; } else if(n==2) { sum += s[1]; } else { sum += s[0]; } printf("%d\n",sum); } return 0; }描述
在 漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电 筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需 的时间。问题是,如何设计一个方案,让这N人尽快过桥。