2018年第九屆藍橋杯B組C/C++決賽題解
1.換零鈔 ok
枚舉
設x表示1元錢的個數,y表示2元錢的個數,z表示5元錢的個數
x+210y+5y == 200,求x+y+z的最小值
2.激光樣式 ok
思路1:dfs搜索
每個位置兩種情況:開激光(在前一個激光沒打開的情況下)、不開激光
思路2:dp動態規划思想
dp[i] 表示前i個激光燈的方案數
狀態轉移方程:dp[i] = dp[i-1] + dp[i-2] //當前方案數 = 不開前一個燈時的方案數(dp[i-2]) + 開前一個燈時的方案數(dp[i-1])
也就是斐波那契數列了。
3.格雷碼 ok
二進制問題,lowbit函數 x & -x 找到末尾為1的位置
4.調手表 ok
bfs搜索
任意數調到任意數,就等於從0開始調到n-1的過程中的最大值
bfs搜索:每個狀態兩種情況 +1秒 +k秒,第一次到達的狀態就是最優解;vis數組作標記,以確保后面不能再更新這個狀態
5. 搭積木 0%
dp
不會
6.矩陣求和 40%
暴力還是能過40%的數據點
拿滿分涉及數論的知識點
歐拉函數:(求[1,p)內與p互質數的個數的函數)
歐拉線性篩,求歐拉函數
我們需要求n以內一共有幾個k*k(1<=k<=n),比如樣例中有幾個1 幾個4 幾個9;也就是說gcd(i,j)=k的(i,j)共有多少對,可以轉化為n/k以內有幾對i和j的gcd(i,j)=1,這樣就可以用歐拉篩法求一下歐拉函數(n/k內有多少個數與i互質),然后前綴和就是滿足條件的對數,然后求總和
參考:https://cloud.tencent.com/developer/article/1200020
參考:http://www.cnblogs.com/8023spz/p/10761240.html