2017 08 07 NOIP提高組 模擬賽B組

2021-08-05 20:07:00 字數 827 閱讀 4261

今天又墊底了。。。

t1:這題的方法十分巧妙,我當場沒有想出來。

其實我們的目的就是要把n-1個數變成0,而剩下的那乙個數變成2^k。換句話說,就是把n個數的二進位制表示形式變成n-1個0,1個10...0,。那也就是要我們盡可能的多消掉1。

所以我們可以這樣做:

先把n個數都化成二進位制形式,然後我們先考慮把最後一位的1給消掉。因為這n個數的和為2^k,所以一定有偶數個數的二進位制形式的末尾為1,所以我們可以把這些數兩兩組合,這樣就可以把最後一位的1消掉,接下來的第二,第三位等同理。最終就可以求出一種方案。

t2:首先設f[i]表示第i個位置的答案,那麼f[i]=min(f[j]+(i-j)*a[j]+b[i])(1<=j首先,若有ja[j']且f[j]+(i-j)*a[j]>f[j']+(i-j')*a[j'],那麼j一定是不如j'優的。

所以,我們可以把有用的位置存下來,以後只需搜尋這些位置就可以了,關鍵是怎麼存?

假設當前已經算出f[i],我們要把i放入序列,並且要把不如i優的踢出序列,那麼若序列中有乙個j滿足a[j]>a[i]或f[i]+(i-i)*a[i]>f[j]+(i-j)*a[j]也就是f[i]>f[j]+(i-j)*a[j],那麼這個j是要被留下的。具體實現可以用兩個陣列互相滾動,這樣可以快很多。

總結:比賽時爆0,這裡總結一下對這類dp的優化。

若要用單調棧優化,那麼一定要針對轉移方程中所有不確定元素來建棧,不能只針對某一部分。比如這道題,應該針對f[j]+(i-j)*a[j]來建棧,而比賽時我只針對了a[i]來建棧。

t3:這題十分水,而比賽時我卻因為檔案輸入輸出打錯而爆0。

正解就是把行縱座標排個序,然後直接模擬就行了。注意:要用二分來查詢。

NOIP提高組 矩陣

在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...

NOIP提高組2005 過河

過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...

NOIP提高組 20151029模擬

其實這套題目並不算太難,但是還是發揮不了100 水平。第一題直接線性篩法,求出質數,然後就可以判斷乙個數是否為質數了。這道題還可以用miller rabin去求,後者的速度較快,如果資料再大些,就要使用後者了。第二題,比賽時發現了,當n 7時,答案會每四個一迴圈,但是就沒有繼續往下想,其實想下去會想...