NYOJ 47 過河問題

2021-08-04 14:20:33 字數 1650 閱讀 8291

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:5

描述

在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計乙個方案,讓這n人盡快過橋。 

輸入

第一行是乙個整數t(1<=t<=20)表示測試資料的組數

每組測試資料的第一行是乙個整數n(1<=n<=1000)表示共有n個人要過河

每組測試資料的第二行是n個整數si,表示此人過河所需要花時間。(0輸出

輸出所有人都過河需要用的最少時間

樣例輸入

1

41 2 5 10

樣例輸出

17
分析:

如果n==1或者n==2,所有人直接過河即可;

如果n==3,用時最短的和用時最長的一起過去,然後用時最短的回來,再和剩下的乙個人過去 ;

如果n>=4,設a[0]表示用時最短的人所用的時間,a[1]為用時第二短的人所用的時間,a[n-1]表示用時最長的人所用的時間,a[n-2]表示用時第二長的人所用的時間。那麼:

當2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]時,就先讓用時最短的人和用時最長的人一起過去,然後用時最短的回來,接著讓用時最短的和用時第二長的一起過去,再讓用時最短的回來。

否則,就先讓用時最短的和用時第二短的一起過去,然後用時最短的回來,接著讓用時最長和用時第二長的一起過去,再讓用時第二短的回來。這樣就相當於剩下了n-2個人。對這n-2個人執行相同的操作,知道剩下不足4個人即可。

[cpp]view plain

copy

print?

#include

#include

using

namespace std;  

int a[1005];  

int main()  

else

n -= 2;  

}  if(n == 3)  

sum += a[1] + a[0] + a[2];  

else

if(n == 2)  

sum += a[1];  

else

sum += a[0];  

printf("%d\n",sum);  

}  return 0;  

}  

#include#includeusing namespace std;

int a[1005];

int main()

else

n -= 2;

}if(n == 3)

sum += a[1] + a[0] + a[2];

else if(n == 2)

sum += a[1];

else

sum += a[0];

printf("%d\n",sum);

}return 0;

}

nyoj 47 過河問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...

NYOJ 47 過河問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...

nyoj 47 過河問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 在漆黑的夜裡,n位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,n個人一共只帶了乙隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,n人所需要的時間已知 而如果兩...