http://poj.org/problem?id=1700
題目大意:
有n個人要過坐船過河,每個人划船有個時間a[i],每次最多兩個人坐一條船過河,且過河時間爲兩個人中速度慢的,求n個人過河的最短時間。
思路:
貪心。
對於每次過河的,有兩種情況:
//最快和最慢過去,然後最快回來,在和次慢過去,最快回來
int action1=a[i-1] + a[0] + a[i-2] +a[0];
//最快和次慢過去,然後最快回來,在次慢和最慢過去,次慢回來
int action2=a[1] +a[0] + a[i-1] +a[1];
每次取最優即可。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1024;
int a[MAXN];
int main()
{
int T;
scanf("%d",&T);
while((T--)!=0)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int i;
int ans=0;
for(i=n;i>=4;i-=2)
{
//最快和最慢過去,然後最快回來,在和次慢過去,最快回來
int action1=a[i-1] + a[0] + a[i-2] +a[0];
//最快和次慢過去,然後最快回來,在次慢和最慢過去,次慢回來
int action2=a[1] +a[0] + a[i-1] +a[1];
ans=ans+ ( (action1 < action2 )? action1:action2);
}
if(i==3)
ans+= a[0]+a[1]+a[2];
if(i==2)
ans+=a[1];
if(i==1)
ans+=a[0];
printf("%d\n",ans);
}
return 0;
}
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static int[] a=new int[1024];
public static void main(String[] args) {
int T;
Scanner in=new Scanner(System.in);
T=in.nextInt();
while((T--)!=0)
{
int n=in.nextInt();
for(int i=0;i<n;i++)
a[i]=in.nextInt();
Arrays.sort(a,0,n);
int i;
int ans=0;
for(i=n;i>=4;i-=2)
{
//最快和最慢過去,然後最快回來,在和次慢過去,最快回來
int action1=a[i-1] + a[0] + a[i-2] +a[0];
//最快和次慢過去,然後最快回來,在次慢和最慢過去,次慢回來
int action2=a[1] +a[0] + a[i-1] +a[1];
ans=ans+ ( (action1 < action2 )? action1:action2);
}
if(i==3)
ans+= a[0]+a[1]+a[2];
if(i==2)
ans+=a[1];
if(i==1)
ans+=a[0];
System.out.println(ans);
}
}
}