1. 程式人生 > >2018年第九屆藍橋杯省賽C++A組題目分析以及思路總結

2018年第九屆藍橋杯省賽C++A組題目分析以及思路總結

    第九屆藍橋杯省選在4月初結束了,最近也出了成績,因為是第一次參加藍橋杯,出結果前有些緊張,不過結果也算是意料之中,成功晉級了國賽了,在這裡總結一下我做題的思路,當然,只說一下解出來的題,有些題因為時間關係,考場上選擇了得分價效比方式而不是複雜的標準解。

第一題 分數

1/1 + 1/2 + 1/4 + 1/8 + 1/16 + ....
每項是前一項的一半,如果一共有20項,
求這個和是多少,結果用分數表示出來。
類似:
3/2
當然,這只是加了前2項而已。分子分母要求互質。
注意:
需要提交的是已經約分過的分數,中間任何位置不能含有空格。
請不要填寫任何多餘的文字或符號。
基礎題,我的思路很簡單,分母都化成2的19次冪,通分,然後寫程式求出分子和分母,答案:1048575/524288

第二題  星期一

整個20世紀(1901年1月1日至2000年12月31日之間),一共有多少個星期一?
(不要告訴我你不知道今天是星期幾)
注意:需要提交的只是一個整數,不要填寫任何多餘的內容或說明文字。    這題在我看來應該是excel解決是最好的,剛拿到手也是用excel和計算器在搞,不過一上來可能比較慌,沒整出來,放到最後手算了下,思路是這樣的,首先程式跑出閏年來,閏年366天,平年365天,把這個世紀的都加一下,得出總天數,然後因為比賽電腦的日曆不允許翻看1990年以前的日曆,所以看了下2000年12月31日的時間,是週末,用剛才算出來的 天數/7,是總的星期數,天數%7看一下剩幾天沒算,倒推下有沒有額外的週一,因為2000年12月31日是週末,所以肯定沒有額外的啦,ok啦。
答案:5217

第三題 乘積尾零

如下的10行資料,每行有10個整數,請你求出它們的乘積的末尾有多少個零?

5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
2049 698 4582 4346 4427 646 9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114 337 4096 8199 7313 3685 211 




注意:需要提交的是一個整數,表示末尾零的個數。不要填寫任何多餘內容。

    這個題也見過類似的,當時沒想到5和2的因子解法,然後我說一下我的思路,剛開始直接將一百個數相乘,當然這是不可以的,一定會越界,當然我也試過了,十個數下來就亂套了,然後我就想可不可以壓縮資料大小呢,我取出前面的乘積結果的後兩位與後一個數相乘,5650乘4542得25662300,將後面的零取出來計數後,再取23與後面的4542相乘,就這樣迴圈,最後答案出來31,考場上比較緊張,也不知道對不對,是否考慮的周全,就最後十分鐘一直在想這個題了,不過還好,結果對啦。答案:31

第四題 第幾個幸運數

到x星球旅行的遊客都被髮給一個整數,作為遊客編號。
x星的國王有個怪癖,他只喜歡數字3,5和7。
國王規定,遊客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。

我們來看前10個幸運數字是:
3 5 7 9 15 21 25 27 35 45
因而第11個幸運數字是:49

小明領到了一個幸運數字 59084709587505,他去領獎的時候,人家要求他準確地說出這是第幾個幸運數字,否則領不到獎品。

請你幫小明計算一下,59084709587505是第幾個幸運數字。


需要提交的是一個整數,請不要填寫任何多餘內容。

    這個題考場上是沒做的,因為我題目沒怎麼看明白,然後看到要求的數字很大,一般的方法估計會進坑,所以就放過了,感興趣的同學可以考慮下動態規劃的思路解決,這裡推薦下《演算法競賽入門經典(第二版)》,其中的醜數例題類似。答案:1905

第五題 列印圖形 

    這個題我就不放題目啦,說一下思路,因為是規律圖形題目,看一下出口處,是size==1,所以考慮size逐漸減小的情況,思路到這裡基本可以了,試一下size/4,size/2,size/3,ok,解決啦,到現在我都沒看這個漂亮的影象是怎麼得到的。
答案:size/3 (這裡沒有分號)

第六題 航班時間

    這個題的考點我覺得在字串處理,這裡提示下大家,如果對字串處理不拿手,我們可以這樣得到部分分數,觀察發現部分測試資料沒有(+1),我們只處理最普通的情況,這樣可以使用最少的時間的到分數。

第七題 三體進攻

    這個題拿到手第一感覺就是如果進行模擬,必然超時的不成樣子,三維線段樹又不會寫,於是只好大模擬收分。比賽結束後思考,可以使用字首和加二分搜尋解決,應該比較合適。

第八題 海島淹沒 

    這個問題個人認為應該解決的不錯,核心思路是bfs,這裡不建議使用dfs。    首先使用bfs對所有海島染色,注意,不同海島給的標記不同,例如,第一個海島給標記1,下一個就是2,這樣做的目的是方便統計最後的剩餘海島。    接下來,按題目描述模擬海島淹沒過程,這個過程不會耗費太多時間,掃描一遍即可。    然後,我們再掃描一邊地圖,統計剩下的海島數目,最後,用開始的海島數減去剩下的,即是答案。    當然這只是一種思路,如果使用這種思路,在第一步染色的時候建議使用bfs,dfs會出現海島上的部分地區掃描不到的問題。

第九題 K的倍數

    這個題目應該使用動態規劃解決的吧,可惜當時想不出來,動態規劃還是一個難點吧,,然後這裡說一下我的思路,這個方法應該也可以過大部分資料,比賽的時候測試了下,基本在要求範圍內都秒出答案。    首先,將給的數按照從大到小排序,從頭到尾迴圈dfs,這個思路大家應該都可以想到(直接dfs的話甚至不需要排序),但是這樣資料稍微一大就超時了。    我在dfs中加入剪枝,思路如下,因為是排序過的陣列,在搜尋過程中,判斷一下如果當前的總數加上接下來可能的最大的數也就是陣列的下一個或兩個位置(一個或者兩個,這個根據搜尋的層數決定,如果搜尋在第一層,加上後面兩個數,如果在第二層了,只加後面的一個即可),相加之後的和如果小於當前已經滿足條件的值,那麼直接return,事實上後面的大部分資料都會直接return,這一點可以想一下,應該是這樣的(><,有點心虛,但應該沒錯)。    好滴,這樣就可以啦,應該是拿到了大部分分數的。

第十題 最小標準差

    這個題啊,看到公式頭髮暈,然後自我安慰一波,嗯,這個是最後一個題,應該不是那麼簡單的,不做了,回去補一下小題。如果再給我一次機會,我仍然不會做這個。。。    到這裡就告一段落啦,過段時間會把坑填一填,準備國賽,希望國賽考場分到北大吼吼吼。如果寫的有不合適之處,大家直接懟我就可以啦,共同學習,嘿嘿。