题目链接:poj1700
/* 两种过河策略: 1、用速度最快的那个每次将人载过河,再回来载其他的人 2、用速度最快的和次快的循环载人,即最快的和次快的先过河,次快的留下,最快的回来,接着最慢和次慢的人过河,次快的回来 */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0xfffffff; const int N = 1005; int a[N]; int main() { int T,n,i; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1; i <= n; i ++) scanf("%d",&a[i]); int sum = 0; sort(a+1, a+n+1);//排序 for(i = n; i >= 4; i -= 2) { int tmp1 = 2*a[1] + a[i] + a[i-1];//策略1 int tmp2 = a[1] + 2*a[2] + a[i];//策略2 sum += min(tmp1, tmp2); } if(i == 3) sum += a[1] + a[2] + a[3];//剩下三个人 if(i == 2) sum += a[2];//剩下两个人 if(i == 1) sum += a[1];//剩下一个人 printf("%d\n",sum); } return 0; }
poj1700过河问题(贪心),布布扣,bubuko.com
原文:http://blog.csdn.net/jzmzy/article/details/21316561