2018藍橋杯第九屆C 語言A組省賽大題題解

2021-09-11 14:55:33 字數 3533 閱讀 1387

為了準備下次比賽(2019a組c++),這裡只寫了大題的題解。(一部分原因也是因為要考研,時間不太夠)

對於下次比賽很有信心,因為看了下大題基本會做。想起去年看這些題還要思考很久就感慨萬分啊,當時以為自己智商不過,哪知道系統的學過演算法後能提公升這麼多思維。所以有的看演算法題崩潰的道友們不要擔心,慢慢學總是學得會的,多學習演算法還是挺有好處的。加油吧!

下面的**注意:為了簡化**和減少**錯誤,我把for迴圈寫成了巨集定義。還有**沒有經過嚴格測試和證明,如果有錯誤還希望道友或大佬們指出,如果有更靈活,或者更有趣的思路,也希望大家分享交流~

【問題背景】

小h前往美國參加了藍橋杯國際賽。小h的女朋友發現小h上午十點出發,

上午十二點到達美國,於是感嘆到「現在飛機飛得真快,兩小時就能到美國了」。

小h對超音速飛行感到十分恐懼。仔細觀察後發現飛機的起降時間都是當地時間。

由於北京和美國東部有12小時時差,故飛機總共需要14小時的飛行時間。

不久後小h的女朋友去中東交換。小h並不知道中東與北京的時差。

但是小h得到了女朋友來回航班的起降時間。小h想知道女朋友的航班飛行時間是多少。

【問題描述】

對於乙個可能跨時區的航班,給定來回程的起降時間。

假設飛機來回飛行時間相同,求飛機的飛行時間。

【輸入格式】

從標準輸入讀入資料。

乙個輸入包含多組資料。

輸入第一行為乙個正整數t,表示輸入資料組數。

每組資料報含兩行,第一行為去程的 起降 時間,第二行為回程的 起降 時間。

起降時間的格式如下

h1:m1:s1 h2:m2:s2

或h1:m1:s1 h3:m3:s3 (+1)

或h1:m1:s1 h4:m4:s4 (+2)

表示該航班在當地時間h1時m1分s1秒起飛,

第一種格式表示在當地時間 當日 h2時m2分s2秒降落

第二種格式表示在當地時間 次日 h3時m3分s3秒降落。

第三種格式表示在當地時間 第三天 h4時m4分s4秒降落。

對於此題目中的所有以 h:m:s 形式給出的時間, 保證 ( 0<=h<=23, 0<=m,s<=59 ).

【輸出格式】

輸出到標準輸出。

對於每一組資料輸出一行乙個時間hh:mm:ss,表示飛行時間為hh小時mm分ss秒。

注意,當時間為一位數時,要補齊前導零。如三小時四分五秒應寫為03:04:05。

【樣例輸入】

317:48:19 21:57:24

11:05:18 15:14:23

17:21:07 00:31:46 (+1)

23:02:41 16:13:20 (+1)

10:19:19 20:41:24

22:19:04 16:41:09 (+1)

【樣例輸出】

04:09:05

12:10:39

14:22:05

【限制與約定】

保證輸入時間合法,飛行時間不超過24小時。

思路:題目每組資料的輸入是兩行,分別是可能跨時區的時間起降時間,所以只需要將兩個飛行耗時直接加起來,抵消掉時差,然後除以二即可。

這裡我是中間計算按秒數計算,最後在用除法取餘得到具體時間。具體格式處理請看**。

#define local

#include #define _for(i,a,b) for(int i=a;i=b;i--)

#define mset(a,val,n) for(int i=0;i

思路:暴力可以得大部分分(40-70),想得滿分這道題花的時間不值,後面還有三道大題呢。所以直接暴力吧。

#define local

#include #define _for(i,a,b) for(int i=a;i=b;i--)

#define mset(a,val,n) for(int i=0;i把'.'當做0,把'#'當做-1(化作整數方便標記連通分量)

1.dfs一次,並在dfs的過程中標連通分量(每個島給乙個編號p,p從1開始)

2.在1的過程中,把會被淹沒的陸地(如果周圍存在海)給予特殊編號-2 

3.最後統計非特殊編號個數cnt, 答案就是p-cnt;

#define local

#include #define _for(i,a,b) for(int i=a;i=b;i--)

#define mset(a,val,n) for(int i=0;i=0&&j>=0&&ist;

_for(i,0,n)_for(j,0,n) if(a[i][j]>0)st.insert(a[i][j]);

printf("%d\n",p-st.size());

}

【題目描述】

眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。

但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。

現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,

使得這三個數的和是 k 的倍數,且這個和最大。資料保證一定有解。

【輸入格式】

從標準輸入讀入資料。

第一行包括 2 個正整數 n, k。

第二行 n 個正整數,代表給定的 n 個數。

【輸出格式】

輸出到標準輸出。

輸出一行乙個整數代表所求的和。

【樣例入】

4 31 2 3 4

【樣例輸出】

9【樣例解釋】

選擇2、3、4。

【資料約定】

對於 30% 的資料,n <= 100。

對於 60% 的資料,n <= 1000。

對於另外 20% 的資料,k <= 10。

對於 100% 的資料,1 <= n <= 10^5, 1 <= k <= 10^3,給定的 n 個數均不超過 10^8。

資源約定:

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 1000ms

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

注意:main函式需要返回0;

只使用ansi c/ansi c++ 標準;

不要呼叫依賴於編譯環境或作業系統的特殊函式。

所有依賴的函式必須明確地在原始檔中 #include 不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

思路:(a+b+c)%k==0 等價於 (a%k+b%k+c%k)==0,所以只要找到三個數,這三個數模k餘數相加等於0即可

所以儲存每個輸入資料的%k取餘,儲存到a[x%k]裡面,a陣列開1000*3空間,只儲存x%k最大的三個x數即可。

然後就是兩個for迴圈找a,b然後c=k-a-b.時間複雜度(k^2);

#define local

#include #define _for(i,a,b) for(int i=a;i=b;i--)

#define mset(a,val,n) for(int i=0;i第十題,看了一下挺簡單的,這種思維題在coderforce上刷太多了,在做好像不會有太大的提公升~~以後有時間再補上(ps如果要得滿分的話,感覺最難的應該是第七題。)

2018第九屆藍橋杯C語言第九題 全球變暖

你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...

第九屆藍橋杯C組 一二題

小明被不明勢力劫持。後被扔到x星站再無問津。小明得知每天都有飛船飛往地球,但需要108元的船票,而他卻身無分文。他決定在x星戰打工。好心的老闆答應包食宿,第1天給他1元錢。並且,以後的每一天都比前一天多2元錢,直到他有足夠的錢買票。請計算一下,小明在第幾天就能湊夠108元,返回地球。public c...

參加第九屆藍橋杯C C B組

寫這篇部落格的目的不是要把所有題目的題意給詳細分析 點出思路 給出答案。只是為了要寫點感受。實在不行,你可以用計算機的時鐘日曆,如果自己做錯了,有沒有很驚喜 意外。2 明碼,話說是9的9次方的值 這個把結果算成是81的同志,你應該清楚明白,不管你當時是緊張,還是粗心大意,或是當推出是 9的9次方 時...