前驅教材:《演算法競賽入門到進階》 清華大學出版社
網購:京東 當當 ??作者簽名書:點我
有建議請加QQ 群:567554289
文章目錄
- 1. 巧用編輯器
- 2. 眼看手數
- (1)迷宮
- (2)七段碼
- 3. 巧用Excel
- (1)數字計算
- (2)日期問題
- 4. 巧用Python
- (1)用Python算大數
- (2)用Python處理字符
??現在的藍橋杯省賽,每次比賽有10題,其中5個填空,5個編程,
??每次比賽都有“送分題”,只需要幾分鐘就能做出來,特別是部分填空題,只需要填答案,不用提交代碼,那么可以用包括編碼在內的多種方法,編碼一般比較慢,所以能不編碼就不要編碼,而是用推理和手算找到答案,這種不用編碼的填空題稱為“手算題”,
??競賽的時間極為緊張,應選用最快的實作方式,
??下面給出4種小技巧:巧用編輯器、眼看手數、巧用Excel、巧用Python,
1. 巧用編輯器
題目來源:2020年度C++ A組,試題A: 門牌制作
題目描述:1到2020的所有數字中,共有多少個2?
??這確實是個送分題,編碼也很簡單:判斷每個數字中有幾個2,然后把所有數字中2的個數加起來,編碼大概5分鐘,
??但是有更簡單的做法:先編碼列印出1~2020這2020個數字,然后粘貼到一個編輯器(word、codeblocks都行)中,選替換功能,用某個字符替換‘2’,共替換624次,這就是答案,用時1分鐘,
??先用代碼列印數字(用python寫代碼更短):
#include<bits/stdc++.h>
using namespace std;
int main(){
int k=0;
for(int i=1;i<=2020;i++)
cout<<i;
}
??列印出2020個數字:
2. 眼看手數
??有的填空題本身比較復雜,但是因為資料簡單,此時用不著編碼,直接用眼睛看,動手數,
(1)迷宮
題目來源:2017年度C++ A組,試題1: 迷宮
題目描述:給出一個迷宮,問迷宮內的人有多少能走出來,
迷宮如下:其中L表示向左走,R表示向右走,U表示向上走,D表示向下走,
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
??這道題是典型的DFS,編碼至少10分鐘,不過因為是個填空題,而且迷宮很簡單,只有100個字符,可以直接數,從左往右數,從上往下數,約2分鐘就能數完,數出來的結果見下面,紅色字符上的人能走出來,
(2)七段碼
題目來源:2020年度C++ A組,試題D: 七段碼
題目描述:七段數碼管,一共有7個發光二極管,問能表示多少種不同的字符,要求發光的二極管是相連的,
??題目要求發光的二極管是相連的,可以用DFS或并查集查找連通塊,編碼時間15分鐘以上,不過,因為圖形簡單,直接手算也行,約3-5分鐘,
??用字符表示數碼管不太方便,改用數字:
??分7種情況:
??亮一個燈:有7種情況,1、2、3、4、5、6、7;
??亮兩個燈:有12、13、23、24、25、…等等;
??亮三個燈:有123、124、125、134、136、234、257…等等;
??亮四個燈,這時不要直接數四個燈,情況與滅三個燈是等價的:滅123、滅124…等等;
??亮五個燈,與滅兩個燈等價:滅12、滅13、滅14、…等等;
??亮六個燈,與滅一個燈等價,有7種情況;
??亮七個燈,有1種情況,
??對以上所有情況求和,
3. 巧用Excel
(1)數字計算
題目來源:2018年度C++ A組,試題1: 分數
題目描述:1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …每項是前一項的一半,如果一共有20項,求這個和是多少,結果用分數表示出來,
??編碼很簡單,幾分鐘就好,也可以用Excel手算,時間差不多,而且不用思考,
??A列填分子,都是1;B列填分母,每行遞增2倍,做法是,在B1填1,在B2填寫“=B1*2”,然后按住B2往下拉到第20行,就填好了所有的分母,
??然后通分求分子分母,分母就是B20的524288,分子實際上就是“SUM(B1:B20)”,用滑鼠選中這個區域,Excel自動算出1048575,
(2)日期問題
題目來源:2018年度C++ A組,試題2: 星期一
題目描述:整個20世紀(1901年1月1日至2000年12月31日之間),一共有多少個星期一?
??用Excel,一個格子輸入日期1901年1月1日,另一個格子輸入2000年12月31日,然后兩個格子相減得36524天,除以7得5217.7周,
??再用excel點2000年12月31日的屬性,選星期,得“星期日”,說明答案就是5217,
4. 巧用Python
??Python處理數字非常簡單,遇到這樣的填空題,可以用Python,
??即使是參加C/C++、Java組比賽,也要學一些Python,以方便手算,
??Python的代碼長度一般比C/C++、Java短很多,例如30行的C++代碼,用Python寫只需要20行,
(1)用Python算大數
題目來源:2018年度C++ A組,試題3: 乘積尾零
題目描述:給100個整數,問它們乘積的末尾有多少個零,
??遇到大數的問題,用Python處理是最簡單的,可以直接硬算,
??不過,其實Python的大數也不是無限大的,下面的代碼,如果一股腦先算出所有的100個數的乘積s,s實在太大了,也是會溢位的,所以乘一個數,就看乘積s后面有沒有0,如果有0就除以10,這樣s就比較小了,
??下面是“乘積尾零”問題的代碼,
#輸入放在一行中,不要分10行
num=[int(i) for i in input().split()]
# input().split()讀一行以空格分開的元素,然后用int()轉為整數
s = 1
cnt = 0
for i in range(len(num)): #連續乘,一邊乘一邊統計0的個數
s *= num[i] #乘一個數
while s%10 == 0: #末尾是零
s /= 10 #除以10,把末尾零去掉
cnt += 1
print(cnt)
(2)用Python處理字符
題目來源:2019年度C++ A組,試題1: 平方和
題目描述:小明對數位中含有2、0、1、9 的數字很感興趣,在1 到40 中這樣的數包
括1、2、9、10 至32、39 和40,共28 個,他們的和是574,平方和是14362,
注意,平方和是指將每個數分別平方后求和,
請問,在1 到2019 中,所有這樣的數的平方和是多少?
??用Python,不用任何演算法,直接把數字看成字符來統計:
sum = 0
for i in range(1,2020):
s = str(i)
if '2' in s or '0' in s or '1' in s or '9' in s:
sum += i*i
print(sum)
(3)
題目來源:2019年度C++ A組,試題2: 數列求值
題目描述:給定數列1, 1, 1, 3, 5, 9, 17, …,從第4 項開始,每項都是前3 項的和,求
第20190324 項的最后4 位數字,
??下面是Python代碼,直接算,非常簡單:
a,b,c = 1,1,1
for i in range(4,20190325):
y=(a+b+c)%10000
a=b
b=c
c=y
print(y)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277457.html
標籤:AI
