一。貪心策略:用最少的時間過河
二。過河方法分析:有倆種方法將最慢的那倆個人送過河。
eg:1 2 5 10
方法1:每次最快的1和次快的2過河,然後最快的1回來,最慢的10和次慢的5過河,最快的2再回來。
此時花費的時間爲method1:2+1+10+2;公式爲:a[0]+2*a[1]+a[i] (備註:數組a[ ]是從小到大有序排列 )
方法2:每次最快的1和最慢的10過河,最快的1回來,再和次慢的5過河,最快的1再回來。
此時花費的時間爲method2:10+1+5+1;公式爲:2*a[0]+a[i-1]+a[i]
每次過河的時候,對方法1的時間和方法2的時間進行比較,選擇最快的方法過河。
最後的結果都是,最慢的那倆個過河。
三。代碼分析:
1. 將輸入的速度數組按從小到大進行排序。
2. 當只有一個人和只有倆個人的情況,需要特殊處理。
#include <stdio.h>
#include <stdlib.h>
int speed[1000];
int output=0;
void Greedy(int* a, int N){
int i=0,j=0;
for(i=N-1;i>0;i=i-2){
if(i==1){
output+=a[1];
}else if(i==2){
output+=a[0]+a[1]+a[i];
}else {
int method1 = a[0]+2*a[1]+a[i];
int method2 = 2*a[0]+a[i-1]+a[i];
if(method1 < method2){
output += method1;
}else{
output += method2;
}
}
}
}
int main()
{
int T, N ;
//freopen("input.txt","r",stdin);
scanf("%d",&T);
int i=0;
for(i=0;i<T;i++){
memset(speed,0,sizeof(speed));
output=0;
scanf("%d",&N);
int j =0;
for(j=0;j<N;j++){
scanf("%d",&speed[j]); //獲取int型數組,加&地址。數組名是該數組首元素的地址,故獲取
}
if(N==1){
printf("%d\n",speed[0]);
}else if(N==2){
printf("%d\n",speed[1]);;
}else{
fastsort(speed,0,N-1);
Greedy(speed,N);
printf("%d\n",output);
}
}
return 0;
}