比賽連線:
這次的比賽,有幾個特點:
(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 設...