運用了猜想,改為快速排序后,系統再次提示,獲得了“學以致用”積分。
改成高精度后,系統也有獲得更多積分的提示。
這說明,江寒對程序做出的每次改進,都能使其通過更多的校驗點。
但系統的幫助也只能到這里了,只能據此判斷出,每個步驟中的程序,都是可以得分的,卻無法判斷出是否能得到滿分。
江寒只能依靠自己豐富的編程經驗,盡可能保證程序無BUG。
搞定了前兩道題后,時間已經過去了1個半小時。
剩下的兩個小時,全部交給最難的第三題。
題目是《開車旅行》。
題目概述:將N個城市編號為1~N,編號小的城市在編號較大的城市之西。
各個城市海拔都不一樣,城市i的海拔為Hi,城市i與j之間的距離d[i,j]為兩城市海拔之差的絕對值。
也就是說d[i,j]=|Hi-Hj|。
A、B二人輪流開車,從A開始,每日輪換。
選擇一個城市S為起點,一直向東,最多行駛X公里,就結束。
A、B駕駛風格不同,B總是沿著前進方向,選擇最近的城市作為目的地,A總是沿著前進方向,選擇第二近的城市作為目的地。
PS:如果兩個城市距離相同,則海拔低的視為較近。
如果其中任何一人,無法按照自己的原則選出目的地,或者到達目的地會使公里總數超過X,就結束旅行。
輸入文件中包含如下內容:城市N的數目,城市1~N的海拔高度,X0,M組Si和Xi。
輸出文件中,要求回答兩個問題。
1、對于給定的X=X0,從哪一個城市出發,A開車行駛的路程與B開車行駛的路程比值最小?
2、對于任意給定的X=Xi和出發城市Si,A、B開車行駛的路程總數是多少?
說實話,這道題的難點,主要在于題目的表述比較復雜。
一般人光看懂題目,就至少需要15分鐘……
江寒也足足花了5分鐘,才搞清楚題目的意思。
但如果讓他評價這道題的難度……
勉強3星吧。
這個題目的簡單之處在于,哪怕用最笨拙的辦法,寫個暴力搜索程序,都能保底70分。
可以說是白給。
但如果想拿滿分,難度直接飆升到天際。
畢竟題目中規定:對于100%的數據,有1≤N≤100,000,1≤M≤10,000;
-1,000,000,000≤Hi≤1,000,000,000;
0≤X0≤1,000,000,000;
1≤Si≤N;
0≤Xi≤1,000,000,000。
其中,數據保證Hi互不相同。
江寒很想吐槽,海拔的上限是10億,這么高的地方,肯定不在地球上吧?
而海拔的下限-10億,這已經LOW穿地心了喂!
好吧,又是一個“艱難”的選擇,到底是穩定拿70分,還是冒著巨大的風險,沖擊更高的分數?
這道題的關鍵仍然是數據預處理。
預處理得好,直接難度減半。
關于預處理,有很多可行的辦法,離散化+鏈表、雙向鏈表、平衡樹……
甚至STL的set都可以。
但不能用復雜度為O(n^2)的算法,那樣很容易在校驗時,時間超限。
畢竟根據規定,每個校驗點只有1秒的運算時間。