過橋遊戲
http://www.plastelina.net/examples/games/game3.html

解法:

  1. 1秒 和 3秒 過去,1秒回來
  2. 8秒 和 12秒 過去,3秒回來
  3. 1秒 和 6秒 過去,1秒回來
  4. 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;
}

results matching ""

    No results matching ""