nyoj 47
題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=47
分析:
如果n==1或者n==2,所有人直接過河即可;
如果n==3,用時最短的和用時最長的一起過去,然后用時最短的回來,再和剩下的一個人過去 ;
如果n>=4,設(shè)a[0]表示用時最短的人所用的時間,a[1]為用時第二短的人所用的時間,a[n-1]表示用時最長的人所用的時間,a[n-2]表示用時第二長的人所用的時間。那么:
當(dāng)2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]時,就先讓用時最短的人和用時最長的人一起過去,然后用時最短的回來,接著讓用時最短的和用時第二長的一起過去,再讓用時最短的回來。
否則,就先讓用時最短的和用時第二短的一起過去,然后用時最短的回來,接著讓用時最長和用時第二長的一起過去,再讓用時第二短的回來。這樣就相當(dāng)于剩下了n-2個人。對這n-2個人執(zhí)行相同的操作,知道剩下不足4個人即可。
#include<stdio.h> #include<algorithm> using namespace std; int a[1005]; int main() {int T, n, i;scanf("%d",&T);while(T--){scanf("%d",&n);for(i = 0; i < n; i++)scanf("%d",&a[i]);sort(a,a+n);int sum = 0;while(n >= 4){if((a[1] * 2 + a[n-1] + a[0]) > (2 * a[0] + a[n-1] + a[n-2])){ //求出最長的兩個人過橋所用的最短時間sum += a[n-1]; //用時最短的和用時最長的一起過去sum += a[0]; //用時最短的回來sum += a[n-2]; //用時最短的和用時第二長的一起過去sum += a[0]; //用時最短的回來}else{sum += a[1]; //最短的和第二短的一起過去sum += a[0]; //最短的回來sum += a[n-1]; //最長的和第二長的一起過去sum += a[1]; //第二短的回來}n -= 2;}if(n == 3)sum += a[1] + a[0] + a[2];else if(n == 2)sum += a[1];elsesum += a[0];printf("%d\n",sum);}return 0; }
總結(jié)
- 上一篇: Minidao_1.6.2版本发布,超轻
- 下一篇: hdu 1055(贪心)