ny47 過河問題

2022-05-06 08:39:11 字數 1575 閱讀 6944

時間限制:1000 ms  |  記憶體限制:65535 kb

難度:5

描述輸入

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

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

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

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

樣例輸入

1

41 2 5 10

樣例輸出

17

講解本題:這是一種簡單的動態規劃問題,思考的時候比較複雜,不太容易理解,大致意思是當兩個人過去後,有乙個人還要回來(把燈送回來,但是送燈回來的時間也要加上),由此考慮求解;

現在假設n個人的過河時間已經從小到大排好序用數列 a1 ,a2 ,a3 ,a4 ,... , an ;

當(n =1) time= a[n] ;

當(n >=2) 時:假如n=4時;

(1)

a3 ,a4 怎麼過,

肯定是a1 , a2 先過去再a1回來。

然後第一種方法(a)a1和a3 一起過,再a1回來和a4一起過 。

總時間 time1 = a1 + a3 + a1 + a4 ;

第二種方法(b)a3和a4一起過再a2回來和a1一起過。

總時間 time2 =a1 + a4 + a2 + a2 ;

time = min(time1 , time2);取最短的方法;

實質上就是這個判斷句if(2*a[2] < a[1]+a[i-1])

例如第一步 a1,a2,先過,時間a2,a1回來,時間a1

第二步,a3,a4,過,時間a4,a2,回來,時間a2, 或者 a1,a4,先過,時間a4,然後,a1回來,時間a1

第三步,a2,a1,過,時間a2, 或者 a1,a3,過,時間a3,,

第一種 a2+a1+a4+a2+a2 第二種 a2+a4+a1+a1+a3

比較兩種差別在a2+a2 a1+a3(a3其實就是i-1)

所以解決了這個,問題就解決了,當然當為三個人時,方法固定,先一和三,然後一回去,再加上二就行了;具體**如下:

1 #include2

#define max 1000

3int

main()420

21for(i = n_person; i >= 3

;)22

28if( 2*a[2] < a[1]+a[i-1

])29

33else

3438

}39 total_time += a[2

];40}41

else

42 total_time = a[1]; //

如果只有乙個人

43 printf("

%d\n

",total_time);44}

45return0;

46 }

NY 47 過河問題 貪心

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

貪心 過河問題(數學思想) ny 47過河

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

ny 47 噴水裝置(一)

噴水裝置 一 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0輸入 第一行m表示有m組測試資料 每一組測試資料的第一行有乙個整數數n,n表示共...