1. 程式人生 > >2016.09.15【初中部 NOIP提高組 】模擬賽C

2016.09.15【初中部 NOIP提高組 】模擬賽C

T1:

這一題,

雖然自己寫的太複雜.

雖然考試時因為一個加號而沒檢查出來從而爆0.

雖然看到別人十分鐘就打好了,而我還在慢慢的調.

雖然……

但還是感覺自己的方法好理解233。

當然,這是最最智障、傻x、噁心的方法。

任何一個數,他的友好數對很明顯只有他的位數那麼多個。

則,我把一個數的友好數對所有求出來。

如果有n個,則這n個互為友好數對的數都有N-1個友好數對。

則這樣子,可以線性求出1到n總共有多少個友好數對。

當然,還需減去1~l-1的友好數對。

但這裡,不能直接減去友好數對個數,而需要減去1~l-1中所有可能影響友好數對的數。

怎麼計算呢?

設一個數x,它的友好數對儲存在w裡。

對於w[i],如果<l 則inc(tot1)

如果<=r則inc(tot2)

那麼對於x,他所能影響的友好數對為:

jc[tot2-1]-jc[tot2-tot1-1]

(jc[i]=1+2+……+i)

最後用1~r的總共友好數對,減去每一個被影響的友好數對的個數就行了。

另一種簡單的方法就是:

你已經求出了友好數對了,直接判斷這些友好數對的個數是否在[l..r]的區間不就行了,在這個區間就累加答案啊!

(我真tm是個智障)

T2:

step1:

因為題目要求路徑必須對稱,所以可以把矩陣上半部的每一個對應的數相加,於是到達對角線位置時,就可以視為走完全程且路徑堆成了。

step2:

spfa把最短路求出.

step3:

bfs求路徑數.

其中求路徑數需要注意,對於

(x,y)=>(xx,yy)

要從(x,y)走到(xx,yy)(假設已是最短路徑),則需要當前(xx,yy)四周的點所有能以最短路徑到(xx,yy)的路徑數僅剩當前這一條(x,y)到(xx,yy)的最短路徑,才加入佇列,否則只加上路徑數,並把路徑數減1。

(╮(╯▽╰)╭智障的我,聽別人講了五遍才明白,理解能力有待提高)

T3:

很容易想到用堆。

不過,需要用個模擬連結串列來判斷一下當前每一個人的身旁是哪些人,然後就可以過了。

(對於不用模擬連結串列而暴力水過的,你牛逼)