過橋遊戲
http://www.plastelina.net/examples/games/game3.html
解法:
- 1秒 和 3秒 過去,1秒回來
- 8秒 和 12秒 過去,3秒回來
- 1秒 和 6秒 過去,1秒回來
- 1秒 和 3秒 過去
#include <stdio.h>
#include <string.h>
#include <algorithm>
int N , array[1000001] , sum;
int min( int a , int b ){
if ( a >= b ) return b;
else return a;
}
int main(){
while ( scanf("%d",&N) == 1 ){
int n;
for ( int i = 1 ; i <= N ; i++ )
scanf("%d",&array[i]);
std :: sort ( array + 1 , array + N + 1 );
sum = 0;
for ( n = N ; n >= 4 ; n -= 2 ){
int t1 = array[1] + array[2] * 2 + array[n];
int t2 = array[1]*2 + array[n-1] + array[n];
sum += min ( t1 , t2 );
}
if ( n == 3 ) sum += array[3] + array[1] + array[2];
else if ( n == 2 ) sum += array[2];
else if ( n == 1 ) sum += array[1];
printf("%d\n",sum);
}
return 0;
}
C++ 註解版
#include<iostream>
#include <algorithm>
using namespace std;
int N , array[1000001] , sum;
//取最小值
int min( int a , int b ){
if ( a >= b ) return b;
else return a;
}
int main(){
//N筆資料,代表N個人要過橋
while ( cin>>N ){
int n;
//輸入n個角色中,每個角色的
for ( int i = 1 ; i <= N ; i++ )
cin>>array[i];
//由小到大排序
sort ( array + 1 , array + N + 1 );
sum = 0;
//未過橋人數>=4人的狀況
for ( n = N ; n >= 4 ; n -= 2 ){
//方案1: 第一快跟第二快過去,第一快回來,最慢兩個過去,第二快回來
int t1 = array[1] + array[2] * 2 + array[n];
//方案2: 第一快帶最慢過去,第一快回來,第一快帶第二慢過去,第一快回來
int t2 = array[1]*2 + array[n-1] + array[n];
//取時間短的方案
sum += min ( t1 , t2 );
}
//未過橋人數是3以下的狀況
if ( n == 3 ) sum += array[3] + array[1] + array[2];
else if ( n == 2 ) sum += array[2];
else if ( n == 1 ) sum += array[1];
cout<<sum<<endl;
}
return 0;
}