noip2005提高組題解

2022-05-18 12:34:39 字數 2245 閱讀 6353

05年的題目絕對是自2023年以來難度最大的。後三題的難度係數分別為0.2、0.2、0.3,而前面幾年的題目中每年最多隻出現一道難度係數為0.2的題目,其難度可見一斑。

強烈推薦這個 ppt,每道題都講得很清楚:

第一題:誰拿了最多獎學金

模擬

第二題:過河

動態規劃+優化

首先看到題目的資料範圍就已經讓人心生畏懼了。1e9這麼大的數字,無論從空間還是時間都無法承受。

動態規劃是很容易就能想到的。

用 f(i) 表示跳到i點時最少踩到的石子數,則

f(i) = min(f(i-s), f(i-s+1), … , f(i-t)) + stone(i)

(stone(i) 用於表示i點處是否有石子,若有則為1,否則為0)

雖然題目給出的資料範圍表示30% 的資料在1e5以內,但是用這種方法只能得到10分。(也許是因為我在一些細節的地方寫錯了)

然後如何進行優化?

我們注意到l可能達到1e9,而石子數最多不超過10,所以可以肯定,(算上起點和終點)至少有兩個點之間的距離比較大,而s和t比較小,則對於較大的一段距離而言,無論怎樣都能跳過中間部分而不踩到石子,也就是說這一段距離內的大部分點即使不進行計算也不會對最終結果產生影響,而能對結果產生影響的區間分布在石子附近。所以我們可以把兩個石子之間的距離縮短,去除中間那些無關緊要的部分。

關於如何縮短距離有很多方法,比如當兩點距離大於100時將它縮短等等。但是縮短到多少呢?

事實上對於每個石頭所在的點i,會影響其結果的點是:i-t, i-t+1, ..., i-s-1, i-s. 所以至少要給它留出t的空段,當然最好是前後各有t,所以可縮短到2t或以上。

第三題:篝火晚會

找規律首先,判斷是否有解是比較容易的:如果有乙個人 a 想和 b 相鄰,但 b 不想和 a 相鄰,那麼必然無解。

由於沒有思路,我判斷了無解之後就直接交了,10 分。

為了方便處理,要把乙個長度為 n 的環拆成 2n 條鏈。因為從每個點出發都可以由兩個方向得到兩條鏈。

然後,在有解的情況下,我們可以構造出最終狀態。我們要做的就是從初始狀態變換到最終狀態。初始狀態和最終狀態各有 2n 種,我們要求出從一種初始狀態到一種最終狀態最少的變換步數。兩個狀態之間的變換步數很明顯等於錯位的元素個數。如果直接列舉計算,複雜度是 o(2n*2n*n)。可以拿 30 分。

我們可以換一種思考方式,把「找最少的錯位元素個數」變為「找最多的不動元素個數」。也就是說從乙個狀態到另乙個狀態,變換步數=總元素個數-位置正確的元素個數。同時我們注意到,初始和最終狀態的各種形式中,元素的相對位置是不會改變的。那麼我們對於每個元素,對其現在位置與應該在的位置作差(如果是負數就加上 n),記為 v[i]。那麼對於 v 值相同的元素,我們總能找到另一種狀態,它們的 v 值都為 0。 那麼我們只要在任意一種狀態裡找 v 值相同的元素即可。我們找到最多有多少元素的 v 值相等,記這個最多的個數為 max,那麼這些數在某個狀態下肯定是不用移動的,所以變換步數就為 n – max。注意要同時考慮逆序的情況,也就是說在初始狀態中取一種,在最終狀態中取一種以及其倒序,對這兩種統計 v 值。

第四題:等價表示式

表示式求值

關於基本的中綴表示式求值問題詳見此文: 。這篇文章說得很好。總結起來如下:

建立兩個棧:運算元棧和運算子棧。每次遇到數字就入棧,遇到操作符的情況下,如果該操作符的優先順序高於棧頂操作符的優先順序就入棧,否則就不斷將運算元和棧頂操作符出棧計算值然後將值入棧,直到棧頂操作符的優先順序低於當前操作符。注意對括號的特殊處理。我的處理方式是對於左括號讓其入棧,如果遇到右括號就不斷彈棧計算,直到遇到左括號,然後將左括號出棧,右括號也就不用入棧了。

然後,判斷兩個表示式是否等價有兩種方法:

代入具體的值並計算,重複幾次,如果相等就基本可以判斷是等價的表示式;

將表示式展開,判斷各項是否相等。

第一種方法實現起來不難,查詢 a 並替換成數字即可。

對於第二種方法,我們可以用乙個陣列 co 來表示乙個多項式。co[i] 表示 ai 的係數。所以 co[0] 表示的就是常數項,co[1] 表示一次項的係數,以此類推。這樣一來四則運算不成問題。問題的糾結之處在於 co 陣列開多大合適。我是看了資料之後才發現居然有 ^5^10 這樣逆天的運算。所以把 co 陣列大小開到了 200 就 ac 了。

注意兩種方法得到的中間結果都有可能爆 long long,所以最好要 mod 乙個比較大的數。

NOIP2005 過河題解

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

noip2005提高組過河

介於被這道題折磨了一晚上,因此很有必要記錄下來做動態規劃及狀態壓縮中易錯事項。題目大意 共m個石子,求青蛙每次以s到t步從座標0跳過座標l踩到的最小石子數。樣例資料 輸入10 2 3 5 2 3 5 6 7 輸出資料範圍 1 l 10 9 1 s t 10,1 m 100 初看此題,可以想到動態規劃...

NOIP2005提高組 過河

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