第四章:4道題
林景擺爛了好一會,大抵是看劉希和顏安都還沒有放棄,搞得他也有點不好意思,重新振作起來后將題目閱覽了一遍。
剛才劉希與顏安的對話他都聽到了,知道這次考試的難點在後五題上,於是率先看起了倒數第五題。
有n個人,m個課。每個人有一個擅長的科目的集合,範圍是零到二的m次方,需要選擇一個兩個人的隊伍,使得這兩個人每個人都至少有一門科目是他會但對方不會的,求選擇的方案數。
其中n的範圍是二到十的五次方,m的範圍是二到二十一。
經過一陣思考後,林景初步確定了解題思路,具體實現還得要上手敲代碼把他沒注意到的細節部分處理好才行。
看了一眼正在努力敲代碼的顏安,才發現他那雙手就沒停下來過,彷彿正在敲的不是代碼,而是小說一樣。
可就算是小說,那也該偶爾停下來思索一番才對。
這種一刻不停地狀態,林景只有在寫基礎題的時候才會進入,稍微有點難度的算法題就需要謹慎考慮慢慢寫了。
顏安那架勢看着就不像是在寫最後五題的樣子。
他不會是想用窮舉法破解吧?
林景腦袋裏沒由來的冒出這麼個念頭,畢竟有的時候碰上實在不會的題目,他們也會用窮舉法試試,說不定能因此獲得些解題思路。
只是現在不比平時訓練,他們是在考試在競爭,哪有那麼多時間浪費,有這寫窮舉法的時間還不如多寫兩道題。
一想到這,林景就知道該自己出手了。
“要不讓我來吧?我已經有思路了。”拍了拍顏安的肩膀,林景壓低聲音說道。
隊伍的攻堅手是他,讓一個大一新生來做這幾道最難的題目,實在是有些為難人家了。
林景對自己之前的擺爛行為感到非常羞愧,連顏安都沒有放棄,他作為隊長怎麼能好意思做出這種事來。
哪知顏安頭也沒回,兩眼盯着屏幕,上面的代碼一行接一行飛快的冒出,“學長等下,我就快寫完了。”
隨着最後一個關鍵字被敲出,顏安的雙手終於停了下來,機房內陷入了短暫的沉寂中。
“學長直接開始寫下一題吧,前面的我都寫了,這道題我思路有點不太對,正愁不知道怎麼寫呢。”
顏安指着紙張上的最後一題說道,讓林景聽得一愣一愣。
這才過去多久?就已經寫完了四題?
林景下意識的看了眼時間,確認了現在距離題目發到他們手上才只過了二十分鐘而已。
又看一眼身側劉希學姐的進度,也是四題,乍一看好像兩人進度一樣,可這才是不對勁的地方。
劉希寫的那是試題的前四道,堪稱最簡單的四題,只是開胃菜而已。而顏安寫的那可是倒數五題,是硬得啃不動的大菜。
他兩的速度居然一樣?
林景感覺這場競爭忽然變的玄幻起來。
且不說顏安寫的那幾題可能連他都無從下手吧,就算是用窮舉法,那也不可能寫這麼快。
除非他那四道題都是亂寫的。
不是沒有這種可能,就像他在這種重要時刻還在擺爛一樣。
林景懷疑的看了眼顏安,“我只是有了倒數第五題的解題思路而已,最後一題暫時還沒看。”
他頂替了顏安所坐的位置,將注意力放在了顏安的代碼上。
是不是亂寫的他一看就知道,也不用順着代碼的邏輯去捋,
將倒數第五題的代碼找出來並拉到最底下,發現只有二十五行。
這種簡單粗暴的方式印證了他的猜想,顏安果然是在亂寫的,因為即便是他來寫這道題,也很難將代碼量壓縮到這種地步。
雖然他還沒開始寫,但初步預估就得要四十行代碼,完全不是顏安這種二十五行代碼能解決的題。
如果顏安寫的其他題目也是像這樣只有二十幾行的話,那二十分鐘搞定四題完全不成問題。
可這有用嗎?代碼追求的是短小沒錯,但還有個最重要最基本的前提是得能運行出結果。
沒有結果的代碼,還不如窮舉法。
如果靠短就能拿分的話,一句“Hello,world”豈不就是全場最高分。
林景默默嘆了口氣,內心早已麻木。
他還以為學弟是不放棄精神,結果等他振作起來一看,哪裏是不放棄,這分明是擺爛加自暴自棄加自欺欺人。
痛苦的揉了揉太陽穴,刪了重來吧,連看都不想看直接就選中全部按下了退格鍵。
正在一邊等另一台電腦啟動軟件的顏安注意到他的動作,“學長你刪我代碼幹嘛?”
這未免也太過分了。
就算是以前他發現了學長的錯誤也沒有這麼干過啊,他還好心好意的加上備註指出錯誤並提出自己的觀點,然後發回給學長。
他這麼好心,結果換來的卻是這樣的對待。
一把從學長手中搶過鍵盤,還好能撤銷刪除操作,顏安將代碼恢復后立即點擊運行。
沒等多久,控制台上出現了代碼的運行結果,“你看,這代碼是沒問題的,可以運行。”
關注到這邊動靜的老師也走了過來,低頭看了一眼屏幕,滿意的點了點頭。
“結果確實正確,沒想到你這兩天技術提升蠻快嘛,是不是掉到哪個懸崖下面撿了武功秘籍啊?說出來讓老師也去撞撞大運。”
對於他兩天沒有參加訓練的事,老師已經不計較了,至少這技術水平提升了。
放在兩天前,顏安就算能寫出這道題來,也很難想到用高位前綴來解題,這得需要顏安對所運用的方法非常熟悉才行。
出乎林景預計的結果讓他傻了眼,獃滯的看了一眼老師,又看了一眼顏安,發現自己才是那個無知又擺爛的傢伙。
連忙給顏安道歉,好在被發現的及時,不然的話林景都不知道自己該怎麼取得顏安的原諒。
在這之後,已經知道倒數第五題被顏安完美解決的他並沒有立即開始對下一題動手,而是認認真真的開始閱讀起顏安的代碼。
畢竟如果讓他來寫,怎麼著也得四十行起步,而且要比顏安的代碼更複雜,所以就很好奇顏安用的是什麼方法,和他比優點在哪。
這一看,就沉迷進去了。
代碼精簡其中的思想不容易領會,他想了好一會,才明白這是運用了高位前綴和來解題。
由於正面枚舉並不好做,顏安就考慮反面情況即題目中兩人會的領域,其中一個人是另一個人的子集。
……
那麼對於某一個狀態S,直接就能得到有多少個狀態T,滿足T包含於S。
得出答案為n*(n-1)/2再減掉非法方案。
理解代碼后的林景徐徐吐出一口氣,不得不對顏安刮目相看,高位前綴難嗎?
難也不難,反正他沒想到用這個方法解題,那對他來說,就是一個需要補足的點。
看完一題的他立即進入到下一題,這一次沒有刪除顏安的代碼,而是在確定能夠運行后再度全身心投入到閱讀代碼中去了。