7天备战蓝桥杯之第一天
7天備戰藍橋杯之第一天
0x1 前言
? 無爾,只為打臉某人。(ps.本來不想玩,誰叫某人喜歡嘲笑我是個垃圾呢,mmp,沒錯我就是個垃圾,我最tm討厭說實話的人了)
0x2 備戰思路
? 以我多年的考試復習法總結出一套規律: 刷真題是最有效的。
0x3 正文
? 先從13年真題開始做起
0x3.1 第一題:高斯日記
第1題:高斯日記大數學家高斯有個好習慣:無論如何都要記日記。他的日記有個與眾不同的地方,他從不注明年月日,而是用一個整數代替,比如:4210后來人們知道,那個整數就是日期,它表示那一天是高斯出生后的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去一天,還有多少時光可以用于浪費呢?高斯出生于:1777年4月30日。在高斯發現的一個重要定理的日記上標注著:5343,因此可算出那天是:1791年12月15日。高斯獲得博士學位的那天日記上標著:8113請你算出高斯獲得博士學位的年月日。提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21請嚴格按照格式,通過瀏覽器提交答案。注意:只提交這個日期,不要寫其它附加內容,比如:說明性的文字。0x3.1.1 分析
? 這道題其實沒啥難度,暴力杯的傳統,但是考點也很明確
? 考點:
? 閏年判斷條件: (year%4 == 0 && year%100!=0)|| year%400==0
? 月份天數:
? 1 3 5 7 8 10 12 月份 31天
? 4 6 9 11 月份 30天
? 2 月份 閏年 29天 平年 28天
? 我通過手工計算:
8113-5343=2770 然后補全16天 也就是從 1792年1月1一日開始 再加2756天 2756 /365~7.6 所以簡單判斷之后: 1792 366 1 1793 365 2 1794 365 3 1795 365 4 1796 366 5 1797 365 6 1798 365 7 1799 365 8也就是365*5+366*2= 2557 2785-2557=199天 199/30=6.1 2 3 4 5 6 7 31+28+31+30+31+30+31=182 199-182=17天 所以結果是 1799-07-17幾分鐘的事情。。。。。。水題
0x3.2 第二題:馬虎的算式
小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。有一次,老師出的題目是:36 x 495 = ?他卻給抄成了:396 x 45 = ?但結果卻很戲劇性,他的答案竟然是對的!!因為 36 * 495 = 396 * 45 = 17820類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54假設 a b c d e 代表1~9不同的5個數字(注意是各不相同的數字,且不含0)能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?請你利用計算機的優勢尋找所有的可能,并回答不同算式的種類數。滿足乘法交換律的算式計為不同的種類,所以答案肯定是個偶數。答案直接通過瀏覽器提交。 注意:只提交一個表示最終統計種類數的數字,不要提交解答過程或其它多余的內容。0x3.2.1 分析
? 送分題直接上代碼:
#include <iostream>using namespace std;int main() {int count=0;int right_num=0;int left_num=0;for(int a=1;a<=9;a++)for(int b=1;b<=9;b++)if(b!=a)for(int c=1;c<=9;c++)if(c!=a && c!=b)for(int d=1;d<=9;d++)if(d!=a && d!=b && d!=c)for(int e=1;e<=9;e++)if(e!=a && e!=b && e!=c && e!=d){right_num = (a*10 + b) * (c*100 + d*10 + e);left_num = (a*100 + d*10 + b) * (c*10 + e);if(right_num == left_num){count++;cout<< (a*10 + b)<< "*"<<(c*100 + d*10 + e) << "=" << (a*100 + d*10 + b)<<"*"<<(c*10 + e) << endl;}// print result}cout<< count <<endl;return 0; }0x3.3 第三題:第39級臺階
小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!站在臺階前,他突然又想著一個問題:如果我每一步只能邁上1個或2個臺階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數步。那么,上完39級臺階,有多少種不同的上法呢? 請你利用計算機的優勢,幫助小明尋找答案。要求提交的是一個整數。 注意:不要提交解答過程,或其它的輔助說明文字0x3.3.1 分析
? 題目其實很簡單,其實是斐波那契數列的變種,限定了步數只能是偶數步(理解題意很重要)
直接上代碼:
0x3.4 第四題 黃金連分數
黃金分割數0.61803... 是個無理數,這個常數十分重要,在許多工程問題中會出現。有時需要把這個數字求得很精確。對于某些精密工程,常數的精度很重要。也許你聽說過哈勃太空望遠鏡,它首次升空后就發現了一處人工加工錯誤,對那樣一個龐然大物,其實只是鏡面加工時有比頭發絲還細許多倍的一處錯誤而已,卻使它成了“近視眼”!!言歸正傳,我們如何求得黃金分割數的盡可能精確的值呢?有許多方法。比較簡單的一種是用連分數:這個連分數計算的“層數”越多,它的值越接近黃金分割數。請你利用這一特性,求出黃金分割數的足夠精確值,要求四舍五入到小數點后100位。小數點后3位的值為:0.618 小數點后4位的值為:0.6180 小數點后5位的值為:0.61803 小數點后7位的值為:0.6180340 (注意尾部的0,不能忽略)你的任務是:寫出精確到小數點后100位精度的黃金分割值。 注意:尾數的四舍五入! 尾數是0也要保留!顯然答案是一個小數,其小數點后有100位數字,請通過瀏覽器直接提交該數字。 注意:不要提交解答過程,或其它輔助說明類的內容。0x3.4.1 分析
? 這道題目也不算特別難,主要是大數加法和除法(減法)上
? 考點分析:
? 1.通過列舉連分數 x=\(\frac{1}{1+x}?\) 可以觀察出 是斐波那契數列的比值
? 2.大數的加法和除法編寫
0x3.5 第五題: 前綴判斷-代碼填空
如下的代碼判斷 needle_start指向的串是否為haystack_start指向的串的前綴,如不是,則返回NULL。比如:"abcd1234" 就包含了 "abc" 為前綴char* prefix(char* haystack_start, char* needle_start) {char* haystack = haystack_start;char* needle = needle_start;while(*haystack && *needle){if(______________________________) return NULL; //填空位置}if(*needle) return NULL;return haystack_start; }0x3.5.1 分析
? 送分題,考察字符數組和指針的基礎知識點。
? 答案: *haystack++ != *needle++ 雖然* 和 + 優先級 且都是從右向左計算也就是說
? *(haystack++)!=*(needle++) 等價上面的答案
0x3.6 第六題: 三部排序
一般的排序有許多經典算法,如快速排序、希爾排序等。但實際應用時,經常會或多或少有一些特殊的要求。我們沒必要套用那些經典算法,可以根據實際情況建立更好的解法。比如,對一個整型數組中的數字進行分類排序:使得負數都靠左端,正數都靠右端,0在中部。注意問題的特點是:負數區域和正數區域內并不要求有序。可以利用這個特點通過1次線性掃描就結束戰斗!!以下的程序實現了該目標。其中x指向待排序的整型數組,len是數組的長度。void sort3p(int* x, int len) {int p = 0;int left = 0;int right = len-1;while(p<=right){if(x[p]<0){int t = x[left];x[left] = x[p];x[p] = t;left++;p++;}else if(x[p]>0){int t = x[right];x[right] = x[p];x[p] = t;right--; }else{____p++______; //填空位置}}}0x3.6.1 分析
? 理解代碼的邏輯:
? 通過p++來循環x數組,這里考察的是x[p] == 0的情況,一開始我的想法是: x[left++]=x[p++]
? 最重要是要分析
int t = x[left];x[left] = x[p];x[p] = t;? 這里是交換x[left]和x[p]的值,也就是不會發生丟失值的情況,所以只要遇到0跳過就好了
0x3.7 第7題: 錯誤票據
某涉密單位下發了某種票據,并要在年終全部收回。每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。你的任務是通過編程,找出斷號的ID和重號的ID。假設斷號不可能發生在最大和最小號。要求程序首先輸入一個整數N(N<100)表示后面數據行數。 接著讀入N行數據。 每行數據長度不等,是用空格分開的若干個(不大于100個)正整數(不大于100000) 每個整數代表一個ID號。要求程序輸出1行,含兩個整數m n,用空格分隔。 其中,m表示斷號ID,n表示重號ID例如: 用戶輸入: 2 5 6 8 11 9 10 12 9則程序輸出: 7 9再例如: 用戶輸入: 6 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196 172 189 127 107 112 192 103 131 133 169 158 128 102 110 148 139 157 140 195 197 185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190 149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188 113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119則程序輸出: 105 120資源約定: 峰值內存消耗 < 64M CPU消耗 < 1000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。3.7.1 分析
? 我感覺這些題目主要是讀題:
? 1.確定范圍 <100行 每一行數目<100個 數值選取int類型,正整數
? 2.理清題意 一串連續的數字,開頭是最小值,結尾是最大值,需要尋找斷號和重號的值
? 這樣子很明顯思路就出來,直接從開頭到結尾遍歷然后把值存進數組下標,判斷數組的值,如果值為0則是短號的,值為2就是重號的了,很經典的水桶排序思想。
直接上代碼:
#include <iostream> #include <string.h> #include <stdio.h> #define maxsize 100007 using namespace std;int num[maxsize];int main() {int n,maxnum=0,minnum=maxsize;memset(num,0,sizeof(num));cin>>n;while(n--){int m;while(scanf("%d",&m)!=EOF){if(m>=maxnum)maxnum=m;if(m<=minnum)minnum=m;num[m]+=1;}}int ans1,ans2;for(int i=minnum;i<=maxnum;i++){if(num[i]==0)ans1=i;if(num[i]==2)ans2=i;}cout<<ans1<<" " <<ans2<<endl;return 0; }3.8 第八題:翻硬幣
小明正在玩一個“翻硬幣”的游戲。桌上放著排成一排的若干硬幣。我們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。比如,可能情形是:**oo***oooo如果同時翻轉左邊的兩個硬幣,則變為:oooo***oooo現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那么對特定的局面,最少要翻動多少次呢? 我們約定:把翻動相鄰的兩個硬幣叫做一步操作,那么要求:程序輸入: 兩行等長的字符串,分別表示初始狀態和要達到的目標狀態。每行的長度<1000程序輸出: 一個整數,表示最小操作步數例如: 用戶輸入: ********** **** oo** o*O* o**O 2->3 o****o**** 程序應該輸出: 5再例如: 用戶輸入: *o**o***o*** **** **** ****o***o**o* *o***o**o*** oo** **** ****o********程序應該輸出: 1資源約定: 峰值內存消耗 < 64M CPU消耗 < 1000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。3.8.1 分析
? 其實這是一個模擬題,規律就是****** 變化的可能是 oo**** o*o***等任何情況,模擬這個操作就行了,又因為是要求最小操作步數,由對稱等價性可知優先選取相鄰兩個不同來進行操作。
代碼如下:
#include <iostream> #include <string.h> using namespace std;int main() {string s1,s2;int minstep=0;getline(cin,s1);getline(cin,s2);for(int i=0;i<s1.length();i++){if(s1[i] == s2[i])continue;else{//模擬翻硬幣s2[i+1]= (s2[i+1]=='*'? 'o':'*');minstep++;}}cout<< minstep <<endl;//cout << "Hello world!" << endl;return 0; }3.9 第九題:帶分數
100 可以表示為帶分數的形式:100 = 3 + 69258 / 714還可以表示為:100 = 82 + 3546 / 197注意特征:帶分數中,數字1~9分別出現且只出現一次(不包含0)。類似這樣的帶分數,100 有 11 種表示法。題目要求: //1234 從標準輸入讀入一個正整數N (N<1000*1000) 1000000 程序輸出該數字用數碼1~9不重復不遺漏地組成帶分數表示的全部種數。 注意:不要求輸出每個表示,只統計有多少表示法!例如: 用戶輸入: 100 程序輸出: 11再例如: 用戶輸入: 105 程序輸出: 6資源約定: 峰值內存消耗 < 64M CPU消耗 < 3000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。0x3.9.1 分析
? 這道題如果用純c來寫代碼量真的巨大,這道題我不會做,參考網上的代碼和思路做出來的。
? N的范圍< 1000000 小于7位數
代碼如下:
#include <iostream> #include <algorithm> #include <string> #include <cstdlib> #include <cstdio>using namespace std;int parse(string s1,int pos, int len) {int res=0;int t=1;for(int j=pos+len-1;j>=pos;j--){res+=(s1[j]-'0')*t;t*=10;}return res; } int main() {std::string s="123456789";int n;int ans=0;cin>>n;do{for(int i=1;i<7;i++){int inta=parse(s,0,i);if(inta>=n) break;for(int j=1;j<=9-i-1;j++){int intb=parse(s,i,j);int intc=parse(s,i+j,9-i-j);if(intb%intc==0 && inta+intb/intc==n) ans++;}}}while(std::next_permutation(s.begin(),s.end()));cout<< ans <<endl;return 0; }0x3.10 第十題:連號區間數
小明這些天一直在思考這樣一個奇怪而有趣的問題:在1~N的某個全排列中有多少個連號區間呢?這里所說的連號區間的定義是:如果區間[L, R] 里的所有元素(即此排列的第L個到第R個元素)遞增排序后能得到一個長度為R-L+1的“連續”數列,則稱這個區間連號區間。當N很小的時候,小明可以很快地算出答案,但是當N變大的時候,問題就不是那么簡單了,現在小明需要你的幫助。輸入格式: 第一行是一個正整數N (1 <= N <= 50000), 表示全排列的規模。 第二行是N個不同的數字Pi(1 <= Pi <= N), 表示這N個數字的某一全排列。輸出格式: 輸出一個整數,表示不同連號區間的數目。示例: 用戶輸入: 4 3 2 4 1程序應輸出: 7用戶輸入: 5 3 4 2 5 1程序應輸出: 9解釋: 第一個用例中,有7個連號區間分別是:[1,1], [1,2], [1,3], [1,4], [2,2], [3,3], [4,4] 第二個用例中,有9個連號區間分別是:[1,1], [1,2], [1,3], [1,4], [1,5], [2,2], [3,3], [4,4], [5,5]資源約定: 峰值內存消耗 < 64M CPU消耗 < 5000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。3.10.1 分析
? 讀題: 題目其實容易混淆我們,其實本意就是讓我分析下樣例
? 3 2 4 1 [1,x]肯定都是排序為1 2 3 4 所以有4種
? [2,2] 可以 [2,3]就是2,4不連續就不行了
? 我們可以想象一下 2 3 4 5 最大值-最小值剛好等于數字數目的時候是滿足條件的, 換個方式來說就是
我給定了五個格子給你 限定最小的是2 最大的是6 這里面占了2個位置還剩3個位置 那么你只有 3 4 5可以選了。
也就是 j-i == max-min
#include <iostream> #include <string.h> #define maxsize 50007using namespace std;int main() {int num[maxsize];int maxn,minn;memset(num,0,sizeof(num));int ans=0;int n;cin>>n;for(int i=1;i<=n;i++){cin>>num[i];}for(int j=1;j<=n;j++){maxn=num[j];minn=num[j];for(int k=j;k<=n;k++){maxn=num[k]>=maxn? num[k]:maxn;minn=num[k]<=minn? num[k]:minn;if(maxn-minn==k-j)ans++;}}cout<< ans <<endl;//cout << "Hello world!" << endl;return 0; }轉載于:https://www.cnblogs.com/xq17dog/p/10560665.html
總結
以上是生活随笔為你收集整理的7天备战蓝桥杯之第一天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5 自定义属性data-*
- 下一篇: html font后面跟多种字体