20111023練習賽解題報告

2021-06-01 04:42:23 字數 1926 閱讀 8991

比賽連線:

這次的比賽,有幾個特點:

(1)題目比較短,是方便大家記憶,繼而在任何時候都可以思考,吃飯可以思考,走路可以思考,acm

不考別的,就考思維; 和

c++的不同之處在於它不僅僅是靠迴圈構成的,還有智慧型在裡面,我們不要教大家程式設計,而是要教大家更好的程式設計。通過對比,大家一定可以發現,原來有更好的做

法,原來題目這麼有趣。

好吧,廢話少說,進入題解:

1001:

可以暴力,開個陣列存f[0]...f[n]

,當然要對

10取模。但有更好的做法。請看

1002。

1002:

資料範圍太大,顯然不能暴力。有如下三種優化辦法:

(1)由f[n]=3f[n-1]-2f[n-2], 

推出f[n]-f[n-1]=2*(f[n-1]-f[n-2]),

進而推出

f[n]=2^n-1,

容易                      解得

f[n]

的最後一位。

(2)多列出幾項,觀察可得最後一位數字以4

為週期迴圈再現,分別為

1,3,7,5,1,3,7,5........

(3)直接用矩陣快速冪求的f[n],

進而求得最後一位

,快速冪矩陣是必不可少的知識。

1003:

可以暴力,用o(n^2)

的時間,對每個數字都訪問一次,但有更好的辦法。請看

1004。

(1)不妨排個序,呼叫系統的快速排序qsort

o(nlogn)

的時間內完成,每個只需要比較前後相關元素。

(2)直接用異或(^

),掃瞄一遍,相同元素會在異或符號下異或掉。希望可以通過這題,讓大家認識到異或的作用。 若

a==b,

則a^b=0

;即有1^1=0

,0^0=1

,1^0=1

,0^1=1。

可以暴力。

設sum[x]

,表示前

x項之和,則

sum[y]-sum[x]

表示x+1到y

項之和。從1到

n分別列舉x,

y,記錄最大值if(

max即為答案。

有更好的做法,參看1006。

資料範圍太大,顯然不可暴力。

最大子串和,動態規劃經典題。

設a[x]

為序列元素,

dp[x]為以x

結束的最大和,則

for(int x=1;x<=n;x++)

if(dp[x]>0)

dp[x+1]=a[x+1]+dp[x];

else

dp[x+1]=a[x+1];

由以上關鍵**求得以x+1

為結尾位置的最大和。

且有dp[0]=0

,為迴圈初界。

至此,o(n)

演算法得出。

可以暴力。

直接統計每乙個數前面的數有多少個小於它本身,o

(n^2

)複雜度。

可以優化,請看1008。、

其實這題是防ak

的,要想優化的話,有很多方法:線段樹,樹狀陣列,伸縮樹,二叉檢索樹

......

但都不是我講得清楚的,真的想ac

得同學可以先去學習一下。

我出這題只是想讓大家知道,acm

和暴力程式設計的不同。

希望大家可以認真思考幾天,嘗試繼續提交通過,具體**過幾天會給出。

這題對於大一新生也比較難,是個廣度優先搜尋(bfs

)過程。

不過在我看來,bfs

是最容易實現的乙個搜尋演算法(而且用處極大),不用遞迴,只要乙個充當佇列的陣列就可以實現。

希望大家可以認真思考幾天,嘗試繼續提交通過,具體**過幾天會給出。

2011新生練習賽三解題報告

a include include include include includeusing namespace std char s 209 int main p,q,pp,qq int main if p.x2 q.x2 p.x1 q.x2 p.y2 q.y2 p.y2 q.y1 if p.x1...

牛客練習賽41 最小相似度 解題報告

思路不錯的題目 考慮到總體的狀態數只有 2 m 中,如果我們把某個串改變1位,這個改變後的串和這個串的答案就是 m 1 由此可見,每個串到另乙個串都有乙個距離,我們把這個距離設為改變的位數,所有串到某個串都有乙個最小位數 x 這個最小位數的最大值 y 的答案 m y 就是我們的答案。我們發現這就是乙...

牛客練習賽 小A與最大子段和 解題報告

在乙個序列 裡找到乙個非空子段 滿足 sum limits b i times i 最大 n le 200000,a i le 2000 長的都一臉的斜率優化 考慮表示乙個子段 l 1,r 為 begin sum ra i i l sum ra i times i a i times l end 設...