luogu P1809 過河問題_NOI導刊2011提高(01)
阿新 • • 發佈:2017-05-06
-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)