2016 6 11紀中模擬賽

2021-07-13 14:53:47 字數 2596 閱讀 3475

題目:

t1:赤裸裸的水題,直接高精度就行了。

t2:(這題本應放到3或4題上,可老師應該是故意放到這裡的吧)考試時我先想到的是貪心,隨後我又證明了我那種貪心是不可取的,可是我想都沒想下去,就認為這道題是dfs+記憶化了。所以,我就開始打記憶化了,可是題目的條件是100000*100000的,但如果開這麼大加上longint的範圍不用想都會爆空間,所以自以為是的我開到了8000*8000*longint…………然而……最後……提交上去……還是爆……空間……了。無奈的我決定一定要學會計算空間的方法:

1tb=1024gb

1gb=1024mb

1mb=1024kb

1kb=1024b

1b=8bit

先要清楚pascal各種型別的取值範圍以及所佔位元組了。

byte——0~255——1b

integer——-32768~32767——2b

longint——-2147483648~2147483647——4b

int64—— -2^63+1~2^63-1——8b

那麼考試中我定義的陣列是8000*8000的,再乘以乙個4=256000000b=250000kb,明顯超過了題目限制的128000kb,所以爆空間只能是吸取乙個教訓了,下次一定不能再犯。

現在說一下正解:其實也是貪心,如果是搜尋記憶化的只能得到50分,而貪心並不是按普通的那一種策略,而是要按二分的貪心策略。亦即,對於當前二分的答案mid,判斷mid是否可行,如果可行的話....不可行的話....,這些都很容易想到,舉例說明:

如樣例:

5 31 

2 8 4 9

先排序:

5 3 

1 2 4 8 9

則答案最短為1,最長為9-1=8,然後mid先等於(l+r) div 2=4

判斷當前從第i(i=1)個數開始的第j個數與第i個數的差達到mid,則把i更新為j,然後累加tot,j是乙個迴圈變數,從2~n。

然後當最後的tot>=c的時候則代表mid時間在這n個數里是可行的,但不一定是最優解,為了最優解,我們需要貪心的繼續往下二分,一些細節的地方就不說了,自己**一下吧。

t3:完全水題,赤裸裸的深搜,注意一下邊界和常數就行了。

t4:題目大意是指,對於兩個序列a,b,依次取a,b序列裡的數(題目中有先後順序)然後求乙個題目要求的最優值,這個最優值是指當前如果在取序列a,如果要轉移到序列b就要消耗一次轉移,總共有w次轉移(當w次轉移用盡時則不能取其他序列了),a,b兩序列總共有t個數,如何選擇轉移的時機使得取得的數最多。

根據這道題的資料範圍,我們可以看到,如果當我們使用搜尋的時候,大概只能得60分,而如果我們加上記憶化則能得大概80分,但是如果要滿分的話要使用動態規劃。

我們可以先看動態規劃題目的幾個特性——這道題擁有無後效性,亦即,對於1~i的乙個順序序列數的選擇不管如何,都不會對以後的選擇產生影響,所以就滿足了無後效性的原則。其次此問題具有最優子結構,也就是說,當前的第i個數,總會依賴前面i-1個數的最優值,來產生第i個值,也就是問題的最優解等於其子問題的最優解。

知道這道題可以用動態規劃的話,我們可以很容易想到用f[i,j]表示前i個數,總共移動j次的最優值。然後,我們這樣想——對於當前第i個數,我們只有可能在a樹上選數,或者在b樹上選數,而對於這兩種情況,所得的狀態也都兩種,第一種不移動,直接移動i-1次,在第..個樹上選數,第二種就是移動,移動i次,在第..個樹上選數。

設num1=1表示當前第i個數是第乙個樹上的——num2=0,num2亦然——num1=0.

狀態轉移方程:

if j mod 2=1 then

f[i,j]:=max(f[i-1,j-1]+num1,f[i-1,j]+num2)

else

f[i,j]:=max(f[i-1,j-1]+num2,f[i-1,j]+num1);

邊界:

if a[i]=1 then f[i,0]:=f[i-1,0]+1 else f[i,0]:=f[i-1,0];

最後輸出max即可。

當然,我們可以對其進行空間優化——我們看到,其實這裡表示的前i個數,是可以省略的,我們可以直接用f[i]表示移動i次所能獲得的最優值。

而邊界需有所改變,f[0]表示的必須是當前第列舉到i個數所產生的值,也就是需在動態規劃做出決策裡面來進行調整邊界, 不能在動態規劃之外的部分先把邊界算好。

其次動態轉移方程也變得簡略一些:

f[j]=+1 | j mod 2=a[i]-1

這裡的a[i]-1和j mod 2的關係,就不詳細講了,請自己**一下。

最後輸出max即可。

這樣優化之後空間複雜度就由原來的o(n·m)變成了o(m),空間複雜度和程式設計複雜度都大大縮小了,而如果想縮小時間複雜度就可以在輸入的時候進行動規——這樣就三重提高了,可見動態規劃的優化是多麼重要,當資料極端化的時候往往能帶給不一樣的收穫。(二維也可以用滾動陣列)

反射(紀中模擬賽 普及)

農夫約翰把他的很多鏡子遺落在房子外面,他的奶牛們對這些鏡子很好奇,於是奶牛們把這些鏡子偷了!奶牛們把鏡子放在了乙個n m的矩陣中,在每個小方格中,他們將鏡子按正對角線或者反對角線的方式放置,也就是說鏡子的放置形狀要麼是 要麼是 某一天晚上,奶牛貝里斯拿著乙個手電筒站在矩陣的外面,他開啟手電筒按水平或...

2016 6 11初中部模擬賽總結

由於昨天在家裡腐了一晚上,起來還是昏昏沉沉的,假期綜合症又犯了。高考假沒了啊!8 10分才出發,在路上 宿舍有耽誤了一些時間,就9 00才到機房。來不及了,看題。t1莫名其妙,t2原題,t3一看dp。感覺今天熊老師變良心了,畢竟下午還要上課 o 仔細看了一下,t2沒有 頓時整個人都不好了,高精度神馬...

2016 6 11模擬 總結

高考假,七天!雖說為了訓練少了一天,但還是有六天。最後一天回來訓練,假期綜合症就犯了 早上九點鐘到了學校,發現人不多,就點開了比賽 第一題 tree 題目大意 有n個城市,m條邊,保證聯通。有n 1個修路隊,每個修路隊可以且僅可以修一條邊,勞累度為邊的長度。求在修完路後保證聯通的情況下最小的勞累度標...