题目链接:http://poj.org/problem?id=1700
解题报告:
1、贪心算法,每次过两个速度最慢的人,抵消那个较慢的人的时间。
#include <stdio.h> #include <algorithm> using namespace std; int a[10000]; int main() { int t; scanf("%d",&t); while(t--) { int i; int time=0; int n; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); if(n==1) { printf("%d\n",a[0]); continue; } else { sort(a,a+n); ///当人数大于3时,让速度最慢的两个人过河。直至剩余2,或者3个人。 for(i=n-1;i>2;i-=2) { ///两种方案 ///1、a[i]和a[i-1]两个人与a[0]一起过河,由a[0]送手电筒 ///2、a[0]和a[1]首先过河,再a[0]过来,再a[i]和a[i-1]过来,再a[1]送手电筒 time+=min(a[i]+a[i-1]+2*a[0],a[1]+a[0]+a[i]+a[1]); } if(i==1)///两个人 time+=a[1]; else time+=a[0]+a[1]+a[2];///a[0]和a[2]过河,再a[0]送手电筒,再a[0]和a[1]过河。 } printf("%d\n",time); } return 0; }