1. 程式人生 > >luogu P1809 過河問題_NOI導刊2011提高(01)

luogu P1809 過河問題_NOI導刊2011提高(01)

-m iostream style 人才 三次 nbsp code mat 問題

題目描述

有一個大晴天,Oliver與同學們一共N人出遊,他們走到一條河的東岸邊,想要過河到西岸。而東岸邊有一條小船。

船太小了,一次只能乘坐兩人。每個人都有一個渡河時間T,船劃到對岸的時間等於船上渡河時間較長的人所用時間。

現在已知N個人的渡河時間T,Oliver想要你告訴他,他們最少要花費多少時間,才能使所有人都過河。

註意,只有船在東岸(西岸)的人才能坐上船劃到對岸。

輸入輸出格式

輸入格式:

輸入文件第一行為人數N,以下有N行,每行一個數。

第i+1行的數為第i個人的渡河時間。

輸出格式:

輸出文件僅包含一個數,表示所有人都渡過河的最少渡河時間

輸入輸出樣例

輸入樣例#1:
4 
6 
7 
10 
15 
輸出樣例#1:
42

說明

[數據範圍]

對於40%的數據滿足N≤8。

對於100%的數據滿足N≤100000。

[樣例解釋]

初始:東岸{1,2,3,4},西岸{}

第一次:東岸{3,4},西岸{1,2} 時間7 第二次:東岸{1,3,4},西岸{2} 時間6 第三次:東岸{1},西岸{2,3,4},時間15 第四次:東岸{1,2},西岸{3,4} 時間7 第五次:東岸{},西岸{1,2,3,4} 時間7

所以總時間為7+6+15+7+7=42,沒有比這個更優的方案。

某thu大佬%%告誡我們數組下標一定要從0開

 1 #include<cstdio>
 2 #include<iostream> 
 3 #include<cmath>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int speed[100001];
 9 
10 int main()
11 {
12     int t,n,tmp;
13         scanf("%d", &n);
14         for(int i=0; i<n; i++)
15         {
16 scanf("%d", &speed[i]); 17 } 18 sort(speed+1,speed+n); 19 // greedy 20 int start = n, ans = 0; 21 while(start) 22 { 23 // start = 1,2,3時直接處理 24 if(start == 1) 25 { 26 ans += speed[0]; 27 break; 28 } 29 else if(start == 2) 30 { 31 ans += speed[1]; 32 break; 33 } 34 else if(start == 3) 35 { // 0,2過河,0回程,0,1過河 36 ans += speed[2]+speed[0]+speed[1]; 37 break; 38 } 39 // start>3根據策略選擇 40 else 41 { 42 43 ans+=min(speed[1]+speed[0]+speed[start-1]+speed[1],speed[start-1]+2*speed[0]+speed[start-2]); 44 start -= 2; 45 } 46 } 47 printf("%d\n", ans); 48 49 return 0; 50 }

luogu P1809 過河問題_NOI導刊2011提高(01)