2018年藍橋杯B組C/C++決賽題解


2018年第九屆藍橋杯B組C/C++決賽題解

點擊查看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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM