華為OD機試-士兵過河
一支N個士兵的軍隊正在趁夜色逃亡,途中遇到一條湍急的大河。
敵軍在T的時長后到達河面,沒到過對岸的士兵都會被消滅。
現(xiàn)在軍隊只找到了1只小船,這船最多能同時坐上2個士兵。
1)當1個士兵劃船過河,用時為 a[i];0 <= i < N
2)當2個士兵坐船同時劃船過河時,用時為max(a[j],a[i])兩士兵中用時最長的。
3)當2個士兵坐船1個士兵劃船時,用時為 a[i]*10;a[i]為劃船士兵用時。
4)如果士兵下河游泳,則會被湍急水流直接帶走,算作死亡。
請幫忙給出一種解決方案,保證存活的士兵最多,且過河用時最短。
輸入描述:
第一行:N 表示士兵數(shù)(0<N<1,000,000)
第二行:T 表示敵軍到達時長(0 < T < 100,000,000)
第三行:a[0] a[1] … a[i]… a[N- 1]
a[i]表示每個士兵的過河時長。
(10 < a[i]< 100; 0<= i< N)
輸出描述:
第一行:”最多存活士兵數(shù)” “最短用時”
示例1 輸入輸出示例僅供調試,后臺判題數(shù)據(jù)一般不包含示例
輸入
5
43
12 13 15 20 50
輸出
3 40
說明
可以達到或小于43的一種方案:
第一步:a[0] a[1] 過河用時:13
第二步:a[0] 返回用時:12
第三步:a[0] a[2] 過河用時:15
示例2 輸入輸出示例僅供調試,后臺判題數(shù)據(jù)一般不包含示例
輸入
5
130
50 12 13 15 20
輸出
5 128
說明
可以達到或小于130的一種方案:
第一步:a[1] a[2] 過河用時:13
第二步:a[1] 返回用時:12
第三步:a[0] a[5] 過河用時:50
第四步:a[2] 返回用時:13
第五步:a[1] a[2] 過河用時:13
第六步:a[1] 返回用時:12
第七步:a[1] a[3] 過河用時:15
所以輸出為:
5 128
示例3 輸入輸出示例僅供調試,后臺判題數(shù)據(jù)一般不包含示例
輸入
7
171
25 12 13 15 20 35 20
輸出
7 171
說明
可以達到或小于60的一種方案:
第一步:a[1] a[2] 過河用時:13
第二步:a[1] 返回用時:12
第三步:a[0] a[5] 過河用時:35
第四步:a[2] 返回用時:13
第五步:a[1] a[2] 過河用時:13
第六步:a[1] 返回用時:12
第七步:a[4] a[6] 過河用時:20
第八步:a[2] 返回用時:13
第九步:a[1] a[3] 過河用時:15
第十步:a[1] 返回用時:12
第十一步:a[1] a[2] 過河用時:13
所以輸出為:
7 171
備注:
1)兩個士兵的同時劃船時,如果劃速不同則會導致船原地轉圈圈;所以為保持兩個士兵劃速相同,則需要向劃的慢的士兵看齊。
2)兩個士兵坐船時,重量增加吃水加深,水的阻力增大;同樣的力量劃船速度會變慢;
3)由于河水湍急大量的力用來抵消水流的阻力,所以2)中過河用時不是a[i] *2,
而是a[i] * 10。
————————————————
版權聲明:本文為CSDN博主「MISAYAONE」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://renjie.blog.csdn.net/article/details/128481843
Java 實現(xiàn):https://renjie.blog.csdn.net/article/details/128481843
Python實現(xiàn):https://renjie.blog.csdn.net/article/details/128481869
C++ 實現(xiàn):https://renjie.blog.csdn.net/article/details/128481900
JavaScript實現(xiàn):https://renjie.blog.csdn.net/article/details/129112940
C語言版本持續(xù)更新中