? “須知少時凌云志,自許人間第一流”
?? 鄙人11月八號有幸參加學校校選拔賽,題型為5道填空題,5道編程題,總時間為4小時。奈何能力有限,只完成了5道填空和3道編程大題,現進行自省自糾,分享學習,與諸君共勉。
? 若有高見,歡迎指點,水平有限,然無懼諸君笑爾。
? 歡迎關注、評論、點贊、收藏,愿你見證我的成長!
目錄
1、 二進制位數
問題描述
1.1代碼實現
?2、跑斷腿的小藍
問題描述
?2.1代碼實現
3、調和級數
問題描述
3.1代碼實現
4、山谷
問題描述
4.1代碼實現
?5、最小矩陣
問題描述
5.1代碼實現
6、總結
1、 二進制位數
問題描述
十進制整數 2 在十進制中是 1 位數,在二進制中對應 10 ,是 2 位數。
十進制整數 22 在十進制中是 2 位數,在二進制中對應 10110 ,是 5 位數。
請問十進制整數 2022 在二進制中是幾位數?
解題思路:1、求一個十進制數的2進制位數,最簡單易懂的方式就是對該數不斷除以2,直至結果為小于0,求除以2的次數即可。
2、例如,4,4/2=2,2/2=1,1/2=0;我們知道4的二進制為100,剛好是三位數。
3、結果為 11。
1.1代碼實現
public static void main(String args[]){int Result=2022;int count=0;while (true){Result/=2;count++;if(Result==0)break;}System.out.println(count);}
?2、跑斷腿的小藍
問題描述
? 小藍每周六、周日都晨跑,每月的 1、11、21、31日也晨跑。其它時間不晨跑。
已知 2022年1月1日是周六,請問小藍整個2022年晨跑多少天?
解題思路:1、此題是往年藍橋杯省賽真題的簡單版,可以看我之前的博文有題解。
2、思路主要是對于明確跑步條件,要考慮到每個月天數不同,2月為28,其他為30,或31,可以通過一個簡單的數組來表示。
3、通過設定week為表示當前為周幾,week=week%7,求余實現,例如當星期九(其實沒有這個說法哈哈),week變成2,即星期二。
4、通過對滿足其中任一條件時天數的累積求得最終答案。
5、結果為 138
?2.1代碼實現
public static void main(String args[]){int Months[]={31,28,31,30,31,30,31,31,30,31,30,31};int week=6;//1月一號為周六int RunDays=0;for(int m=0;m<12;m++)for (int days=1;days<=Months[m];days++){if(days==1||days==11||days==21||days==31||week==6||week==0){RunDays++;}week++;week=week%7;//求余來設定周幾}System.out.println(RunDays);}
3、調和級數
問題描述
小藍特別喜歡調和級數 S(n)=1/1+1/2+1/3+1/4+…+1/n 。
請問,n 至少為多大時,S(n)>12 ?
解題思路:1、本題為簡單的累加計數思路,當S(n)小于12時,通過對n進行累加
2、當S(n)大于12時即跳出循環,求得n
3、結果為 91380
3.1代碼實現
public static void main(String args[]){double Sum=0;int Num=0;while (Sum<=12){Sum+=1.0/(Num+1);Num++;}System.out.println(Num);}
4、山谷
問題描述
? 給定一個字母矩陣,如果矩陣中的某個位置不在四條邊上,而且該位置上的字母小于其上下左右四個位置的字母,則稱為一個山谷。
例如,對于如下矩陣
DDDDD
CADCE
FFFFA
?共有兩個山谷,位于第二行第二列和第四列。請注意第二行第三列和第三行第五列都不是山谷。
對于如下30行60列的字母矩陣(請用等寬字體查看),請問有多少個山谷?
PHQGHUMEAYLNLFDXFIRCVSCXGGBWKFNQDUXWFNFOZVSRTKJPREPGGXRPNRVY
STMWCYSYYCQPEVIKEFFMZNIMKKASVWSRENZKYCXFXTLSGYPSFADPOOEFXZBC
OEJUVPVABOYGPOEYLFPBNPLJVRVIPYAMYEHWQNQRQPMXUJJLOOVAOWUXWHMS
NCBXCOKSFZKVATXDKNLYJYHFIXJSWNKKUFNUXXZRZBMNMGQOOKETLYHNKOAU
GZQRCDDIUTEIOJWAYYZPVSCMPSAJLFVGUBFAAOVLZYLNTRKDCPWSRTESJWHD
IZCOBZCNFWLQIJTVDWVXHRCBLDVGYLWGBUSBMBORXTLHCSMPXOHGMGNKEUFD
XOTOGBGXPEYANFETCUKEPZSHKLJUGGGEKJDQZJENPEVQGXIEPJSRDZJAZUJL
LCHHBFQMKIMWZOBIWYBXDUUNFSKSRSRTEKMQDCYZJEEUHMSRQCOZIJIPFION
EEDDPSZRNAVYMMTATBDZQSOEMUVNPPPSUACBAZUXMHECTHLEGRPUNKDMBPPW
EQTGJOPARMOWZDQYOXYTJBBHAWDYDCPRJBXPHOOHPKWQYUHRQZHNBNFUVQNQ
QLRZJPXIOGVLIEXDZUZOSRKRUSVOJBRZMWZPOWKJILEFRAAMDIGPNPUUHGXP
QNJWJMWAXXMNSNHHLQQRZUDLTFZOTCJTNZXUGLSDSMZCNOCKVFAJFRMXOTHO
WKBJZWUCWLJFRIMPMYHCHZRIWKBARXBGFCBCEYHJUGIXWTBVTREHBBCPXIFB
XVFBCGKCFQCKCOTZGKUBMJRMBSZTSSHFROEFWSJRXJHGUZYUPZWWEIQURPIX
IQFLDUUVEOOWQCUDHNEFNJHAIMUCZFSKUIDUBURISWTBRECUYKABFCVKDZEZ
TOIDUKUHJZEFCZZZBFKQDPQZIKFOBUCDHTHXDJGKJELRLPAXAMCEROSWITDP
TPCCLIFKELJYTIHRCQAYBNEFXNXVGZEDYYHNGYCDRUDMPHMECKOTRWOSPOFG
HFOZQVLQFXWWKMFXDYYGMDCASZSGOVSODKJGHCWMBMXRMHUYFYQGAJQKCKLZ
NAYXQKQOYZWMYUBZAZCPKHKTKYDZIVCUYPURFMBISGEKYRGZVXDHPOAMVAFY
RARXSVKHTQDIHERSIGBHZJZUJXMMYSPNARAEWKEGJCCVHHRJVBJTSQDJOOTG
PKNFPFYCGFIEOWQRWWWPZSQMETOGEPSPXNVJIUPALYYNMKMNUVKLHSECDWRA
CGFMZKGIPDFODKJMJQWIQPUOQHIMVFVUZWYVIJGFULLKJDUHSJAFBTLKMFQR
MYJFJNHHSSQCTYDTEAMDCJBPRHTNEGYIWXGCJWLGRSMEAEARWTVJSJBAOIOJ
LWHYPNVRUIHOSWKIFYGTYDHACWYHSGEWZMTGONZLTJHGAUHNIHREQGJFWKJS
MTPJHAEFQZAAULDRCHJCCDYRFVVRIVUYEEGFIVDRCYGURQDREDAKUBNFGUPR
OQYLOBCWQXKZMAUSJGMHCMHGDNMPHNQKAMHURKTRFFACLVGRZKKLDACLLTEO
JOMONXRQYJZGINRNNZWACXXAEDRWUDXZRFUSEWJTBOXVYNFHKSTCENAUMNDD
XFDMVZCAUTDCCKXAAYDZSXTTOBBGQNGVVPJGOJOGLMKXGBFCPYPCKQCHBDDZ
WRXBZMQRLXVOBTWHXGINFGFRCCLMZNMJUGWWBSQFCIHUBSJOLLMSQSGHMCPH
ELSOTFLBGSFNPCUZSRUPCHYNVZHCPQUGRIWNIQXDFJPWPXFBLKPNPEELFJMT
解題思路: 1、本題初看有點唬人,其實原理不難,求山谷數,其實求某個字母其上下左右都比它大的數量。
2、首先建立一個字符串數組,大小為30,輸入并存儲這些字符串。
3、然后使用String中的常用方法charAt()來通過下標獲取某個字符,遍歷1800個字母后,篩選符合條件的字母,即其上、下、左、右都大于它。
4、通過計數后得到答案。
5、結果為 276
4.1代碼實現
public static void main(String agrs[]){Scanner scanner=new Scanner(System.in);String []Array=new String[30];for(int i=0;i<30;i++){Array[i]=scanner.next();}//System.out.println("Over!");int count=0;for(int l=1;l<29;l++)for (int c=1;c<59;c++){if(Array[l].charAt(c)<Array[l-1].charAt(c)&&Array[l].charAt(c)<Array[l+1].charAt(c)&&Array[l].charAt(c)<Array[l].charAt(c-1)&&Array[l].charAt(c)<Array[l].charAt(c+1))count++;}System.out.print(count);}
?5、最小矩陣
問題描述
? 小藍有一個 100 行 100 列的矩陣,矩陣的左上角為 1。其它每個位置正好比其左邊的數大 2,比其上邊的數大 1 。
例如,第 1 行第 2 列為 3,第 2 行第 2 列 為 4,第 10 行第 20 列為 48。
小藍想在矩陣中找到一個由連續的若干行、連續的若干列組成的子矩陣,使得其和為 2022,請問這個子矩陣中至少包含多少個元素(即子矩陣的行數和列數的乘積)
解題思路:
1、矩陣應該是如圖所示的分布
2、首先需要構建該矩陣,實現其右邊元素比左邊大1,下邊比上大2,代碼入下:
int Array[][] = new int[100][100];for (int L = 0; L <99; L++) {for (int C = 0; C <99; C++) {if (L == 0 && C == 0)Array[L][C] = 1;if (C == 0 && L != 0)Array[L][C] = Array[L - 1][C] + 1;Array[L][C + 1] = Array[L][C] + 2;}}
即每一行的元素都是左邊元素+2后的值,每一列的數,都是上一個元素+1后的值!
(可惡啊,構建這個矩陣也想了我好久)
3、本人的想法是暴力解法,即構建一個Sum方法對于其子矩陣求和,并通過子矩陣最后一個元素的下標求該子矩陣總共的元素數量!
即Result=(2+1)*(3+1)=12
4、通過遍歷全部元素可得子矩陣中和未2022的子矩陣有多個符合條件,且須為最小的元素數量
5、結果為 12
5.1代碼實現
public static void main(String agrs[]) {int Sum=0;int Result=0;int Array[][] = new int[100][100];for (int L = 0; L <99; L++) {for (int C = 0; C <99; C++) {if (L == 0 && C == 0)Array[L][C] = 1;if (C == 0 && L != 0)Array[L][C] = Array[L - 1][C] + 1;Array[L][C + 1] = Array[L][C] + 2;}}for (int x = 0; x <100; x++) {for (int y = 0; y <100; y++) {for(int n=1;n<100-x;n++){for (int k=1;k<100-y;k++){Sum=FindSum(Array,x,y,n,k);if(Sum==2022) {Result=n*k;//System.out.println(n*k);break;}else if(Sum>2022)break;}}}}System.out.println(Result);}public static int FindSum(int Num[][],int x,int y,int x1,int y2){int Sum=0;for(int L=x;L<x+x1;L++) {for (int C=y; C< y + y2; C++)Sum += Num[L][C];}return Sum;}
6、總結
? 總的來說,題目有難有簡單,但是都值得我們去細細思索,去鉆研,本期題解就到這里了,歡迎下期再見(五道編程大題)。歡迎關注!!
發文不易,懇請大佬們高抬貴手!
點贊:隨手點贊是種美德,是大佬們對于本人創作的認可!
評論:往來無白丁,是你我交流的的開始!
收藏:愿君多采擷,是大佬們對在下的贊賞!?