天天看點

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

今年的藍橋杯又已經結束了,做的還是不怎麼樣,很多題目不難但就是算不出最終的結果,很是糾結,看來路還很長,另外昨天(2013-5-7)也受到了也受到了微軟的thank you letter了,哎,都是苦逼的一天。不說了,直接看題吧,如果你對我的做法有異議或者有更好的解法,請給我留言,我會及時更新~~~~~

 大數學家高斯有個好習慣:無論如何都要記日記。

他的日記有個與衆不同的地方,他從不注明年月日,而是用一個整數代替,比如:4210

後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒着主人:日子又過去一天,還有多少時光可以用于浪費呢?

高斯出生于:1777年4月30日。

在高斯發現的一個重要定理的日記上标注着:5343,是以可算出那天是:1791年12月15日。

高斯獲得博士學位的那天日記上标着:8113   請你算出高斯獲得博士學位的年月日。送出答案的格式是:1799-07-16,例如:1980-03-21

請嚴格按照格式,通過浏覽器送出答案。

注意:隻送出這個日期,不要寫其它附加内容,比如:說明性的文字。

解析:這題應該算是沒什麼難度,直接計算即可。因為高斯是4月30出生的,是以我這裡先算到12月31号,看看他年份是否需要加1,接下來就是按照每12個月一年來計算了。

結果為1799-07-16

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

ps:希望大家注意到他出生的那天為第一天,要不會多算一天的。

小明正看着 203879 這個數字發呆。 原來,203879 * 203879 = 41566646641這有什麼神奇呢?仔細觀察,203879 是個6位數,并且它的每個數位上的數字都是不同的,并且它平方後的所有數位上都不出現組成它自身的數字。具有這樣特點的6位數還有一個,請你找出它!

再歸納一下篩選要求:

   1. 6位正整數

   2. 每個數位上的數字不同

   3. 其平方數的每個數位不含原數字的任何組成數位

答案是一個6位的正整數。

請通過浏覽器送出答案。

注意:隻送出另一6位數,題中已經給出的這個不要送出。

注意:不要書寫其它的内容(比如:說明性的文字)。

解析:這題說難不難,但就是很難得到正确答案。加上當時我考慮問題也不是很全面,就沒做出來這道水題。

先說明一下,i為6位數i*i最多12位,int放不下,long也不行,__int64不知道行不,這個資料類型我沒怎麼用過,這裡就不說了。我這裡直接用一個20位的數組來存放i*i的結果,算法就是模拟連國小生都會的錯位相加法。其次是判斷i各個位上的數字是否相同,這裡我用一個長度為10的數組n,i中出現的數字作為數組下标,然後周遊i的每一位wei進行n[wei]++操作,最後判斷n中的值是否都為0 或1即可。

答案:639172

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

小明參加了學校的趣味運動會,其中的一個項目是:跳格子。

地上畫着一些格子,每個格子裡寫一個字,如下所示:(也可參見p1.jpg)

從我做起振

我做起振興

做起振興中

起振興中華

比賽時,先站在左上角的寫着“從”字的格子裡,可以橫向或縱向跳到相鄰的格子裡,但不能跳到對角的格子或其它位置。一直要跳到“華”字結束。要求跳過的路線剛好構成“從我做起振興中華”這句話。請你幫助小明算一算他一共有多少種可能的跳躍路線呢?

答案是一個整數,請通過浏覽器直接送出該數字。

注意:不要送出解答過程,或其它輔助說明類的内容。

解析:一看這題比較爽,這幾天做了不少這種題目了,很明顯就是樹的深度周遊嘛哈哈!把每個格子都換成一個數字,從0算起,這樣,題目就變成了從0格跳到第7格的路線數目。

答案是:35

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

    小李的店裡專賣其它店中下架的樣品電視機,可稱為:樣品電視專賣店。

    其标價都是4位數字(即千元不等)。

    小李為了标價清晰、友善,使用了預制的類似數位管的标價簽,隻要用顔色筆塗數字就可以了(參見p1.jpg)。

    這種價牌有個特點,對一些數字,倒過來看也是合理的數字。如:1 2 5 68 9 0 都可以。這樣一來,如果牌子挂倒了,有可能完全變成了另一個價格,比如:1958 倒着挂就是:8561,差了幾千元啊!!

    當然,多數情況不能倒讀,比如,1110 就不能倒過來,因為0不能作為開始數字。

    有一天,悲劇終于發生了。某個店員不小心把店裡的某兩個價格牌給挂倒了。并且這兩個價格牌的電視機都賣出去了!

    慶幸的是價格出入不大,其中一個價牌賠了2百多,另一個價牌卻賺了8百多,綜合起來,反而多賺了558元。

    請根據這些資訊計算:賠錢的那個價牌正确的價格應該是多少?

答案是一個4位的整數,請通過浏覽器直接送出該數字。

解析:這題讓我說什麼呢,什麼難的資料結構都沒有考,就是考的分析問題的能力。哎,自己考試當時審題不細,沒看到價格是4位數,還在那裡苦逼的從3位數開始假設,哎,什麼時候也不能着急呀,心急吃不了熱豆腐。

我這裡先找出差價在200到300的價格,沒找到一個就再去找差價在800到900的所有價格,兩個差價相減,若結果等于558,則得到所要結果。

答案:9088,(看好題目讓你輸出那個)

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

    如下的代碼判斷 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(______________________________) returnnull;  //填空位置

       }

       if(*needle)return null;

       returnhaystack_start;

}

請分析代碼邏輯,并推測劃線處的代碼,通過網頁送出。

注意:僅把缺少的代碼作為答案,千萬不要填寫多餘的代碼、符号或說明文字!!

解析:這題算是個水題吧,應該沒人會做錯。

答案:*(haystack++)!=*(needle++)

    正常的表達式稱為中綴表達式,運算符在中間,主要是給人閱讀的,機器求解并不友善。

    例如:3 + 5 * (2 + 6) - 1

    而且,常常需要用括号來改變運算次序。

    相反,如果使用逆波蘭表達式(字首表達式)表示,上面的算式則表示為:

    -+ 3 * 5 + 2 6 1

    不再需要括号,機器可以用遞歸的方法很友善地求解。

    為了簡便,我們假設:

   1. 隻有 + - * 三種運算符

   2. 每個運算數都是一個小于10的非負整數

    下面的程式對一個逆波蘭表示串進行求值。

    其傳回值為一個結構:其中第一進制素表示求值結果,第二個元素表示它已解析的字元數。

struct ev

       int result;  //計算結果

       int n;       //消耗掉的字元數

};

struct ev evaluate(char* x)

       structev ev = {0,0};

       structev v1;

       structev v2;

       if(*x==0)return ev;

       if(x[0]>='0'&& x[0]<='9'){

              ev.result = x[0]-'0';

              ev.n = 1;

              return ev;

       v1= evaluate(x+1);

       v2= _____________________________;  //填空位置

       if(x[0]=='+')ev.result = v1.result + v2.result;

       if(x[0]=='*')ev.result = v1.result * v2.result;

       if(x[0]=='-')ev.result = v1.result - v2.result;

       ev.n= 1+v1.n+v2.n;

       return ev;

解析:這題考察的是遞歸,沒錯,又是遞歸,整套題一共10道,一半以上都要用遞歸,我記得去年遞歸考的也挺多的貌似。

這題思路不是很難,主要是分析結構體struct ev中n元素的作用,為什麼要保留這個值,這個值的含義是什麼,把這個弄明白就差不多做出來這道題目了。其實這程式就是把輸入的波蘭式字元串分為了兩半部分,已經解析的和未解析的。把已經解析的值加上未解析的值就是最後的值了。可以看出v1是已經解析的值,那麼v2就隻能是未解析的值了。

答案是:

evaluate(x+v1.n+1)

ps:當時由于考場氣氛比較緊張,加上自己時間沒把握好,怕大題沒時間做了,就考慮了30秒直接填了個evaluate(2+x),哈哈,扯淡了吧。

    某涉密機關下發了某種票據,并要在年終全部收回。

    每張票據有唯一的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 179118 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 145116 151 143 175 120 161 134 162 190

149 138 142 146 199 126 165 156 153 193 144166 170 121 171 132 101 194 187 188

113 130 176 154 177 120 117 150 114 183 186181 100 163 160 167 147 198 111 119

105 120

資源約定:

峰值記憶體消耗 <64m

cpu消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘内容。

所有代碼放在同一個源檔案中,調試通過後,拷貝送出該源碼。

注意: main函數需要傳回0

注意: 隻使用ansi c/ansi c++ 标準,不要調用依賴于編譯環境或作業系統的特殊函數。

注意: 所有依賴的函數必須明确地在源檔案中 #include<xxx>, 不能通過工程設定而省略常用頭檔案。

送出時,注意選擇所期望的編譯器類型。

解析:這題貌似又是一道水題,這裡用一個數組a[10000]代表id号出現的次數,每讀入一個id時,執行a[id]++操作。我用了一個小技巧,在讀入時儲存下id号的最大值與最小值,這樣可以為後面判斷那個id遺漏(即a[id]==0)哪個id重複(即a[id]==2)提供一個範圍控制。

ps:當測試資料比較多時,建議用freopen進行輸入輸出的重定向。很是友善。

    小明開了一家糖果店。他别出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。

    小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

    你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大于17的任何數字都可以用4和7組合出來。

    本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

輸入:

兩個正整數,表示每種包裝中糖的顆數(都不多于1000)

要求輸出:

一個正整數,表示最大不能買到的糖數

4 7

程式應該輸出:

17

再例如:

3 5

7

cpu消耗  < 3000ms

解析:首先慚愧一下,時隔半年多這裡的題目我都還沒有完全解決,人就是這樣,惰性,享受,總是不能夠認真的對待學習并把它當成一種樂趣。 by 2013-11-25

轉入正題,首先這道題我現在看到以後,第一印象使用擴充的歐幾裡德算法來解決,但是發現無從下手。于是google一番之後發現一個新的思路,這個方法是這麼樣的,

假設我們輸入數字為a,b(a<b),則可以發現,由a和b産生的數字序列,若存在由n開始的a個連續的數,n、n+1、……、n+a-1,則可以得到最大不能組合的數字為n-1,因為後邊的所有的數都可以由n+a,n+1+a,…………,n+a-1+a,疊代産生,是以隻需要求出n即可。

這裡a,b是我們輸入的糖的個數,這裡為什麼是a個連續的數不是a-1或者其他的呢,因為a是我們已經有的數,我們不能保證其他數字我們可以湊出來,如果你不懂我說的話,完全可以忽略這句。

這裡還有個問題,我們如何能夠得到a與b組合而成的序列呢,這裡我們需要從小到大排好的序列,這樣友善我們判斷是否已經得到a個連續的序列了。

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

    如圖p1.jpg所示,3 x 3 的格子中填寫了一些整數。

    我們沿着圖中的紅色線剪開,得到兩個部分,每個部分的數字和都是60。

    本題的要求就是請你程式設計判定:對給定的m x n 的格子中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。

    如果存在多種解答,請輸出包含左上角格子的那個區域包含的格子的最小數目。  

    如果無法分割,則輸出 0

程式輸入輸出格式要求:

程式先讀入兩個整數 m n 用空格分割 (m,n<10)

表示表格的寬度和高度

接下來是n行,每行m個正整數,用空格分開。每個整數不大于10000

程式輸出:在所有解中,包含左上角的分割區可能包含的最小的格子數目。

3 3

10 1 52

20 30 1

1 2 3

3

4 3

1 1 1 1

1 30 80 2

1 1 1 100

10

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

cpu消耗  < 5000ms

 解析:這題我沒做出來,是看了 zyy34472 的代碼後貼出來的。其實這題大家都應該能看出來是dfs,我記得當時我dfs的時候無法判斷劃分的區域是不是連在一起的,所有肯定是wrong answer,看了zyy34472 的代碼,覺得代碼中用的巧妙的地方是move數組的用法,我到現在也不知道為什麼他的代碼能判斷出所求區域是不是連在一起的,大家先看看吧,有什麼看法環境評論。

ps,今年貌似藍橋杯有個測試平台,我把上面有問題的代碼copy過去運作竟然過了100分(測試環境不認識bool類型,需要把bool換成int,true改成1,false改成0即可),我了個去,這個藍橋杯是不是有點坑爹(by 2014-3-10)

2013第四屆藍橋杯 C/C++大學A組 真題答案解析【交流帖】1.高斯日記2.排它平方數3. 振興中華4. 颠倒的價牌5. 字首判斷6. 逆波蘭表達式7. 錯誤票據 8. 買不到的數目9. 剪格子10. 大臣的旅費

很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用于連接配接首都和王國内的各大城市。

為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。

 j是t國重要大臣,他巡查于各大城市之間,體察民情。是以,從一個城市馬不停蹄地到另一個城市成了j最常做的事情。他有一個錢袋,用于存放往來城市間的路費。

 聰明的j發現,如果不在某個城市停下來修整,在連續行進過程中,他所花的路費與他已走過的距離有關,在走第x千米到第x+1千米這一千米中(x是整數),他花費的路費是x+10這麼多。也就是說走1千米花費11,走2千米要花費23。

 j大臣想知道:他從某一個城市出發,中間不休息,到達另一個城市,所有可能花費的路費中最多是多少呢?

輸入格式:

輸入的第一行包含一個整數n,表示包括首都在内的t王國的城市數

城市從1開始依次編号,1号城市為首都。

接下來n-1行,描述t國的高速路(t國的高速路一定是n-1條)

每行三個整數pi, qi,di,表示城市pi和城市qi之間有一條高速路,長度為di千米。

輸出格式:

輸出一個整數,表示大臣j最多花費的路費是多少。

樣例輸入:

5

1 2 2

1 3 1

2 4 5

2 5 4

樣例輸出:

135

樣例說明:

大臣j從城市4到城市5要花費135的路費。

繼續閱讀