蓝桥杯单片机十一届省赛_“第十届蓝桥杯青少组C++省赛”前三题解题思路及参考答案!...
關注
及時了解信息學競賽相關資訊
第十一屆藍橋杯青少組C++省賽即將到來,待考的各位小同學有沒有刷完去年的真題呢?以下是為大家復習準備的“第十屆藍橋杯青少組C++省賽”前三題解題思路及參考答案。祝福大家在考場上取得佳績!
1
水下探測器
(滿分 50 分)
【原理】
水下探測器可以潛入湖中在任意水深進行科學探索。
湖水的最大深度為 h 米,即它在湖底時到水面的距離(0 ≤ h ≤ 100)。
探測器最初的水下深度為?s 米(0 ≤ s ≤ 100),當探測器不在水面(當前深度大于?0)時,每個?u 指令可使它上浮?1 米,而當探測器在水面時,u 指令是無效的;
當探測器不在湖底(當前深度小于 h)時,每個 d 指令可使它下沉 1 米,而當探測器在湖底時,d 指令是無效的; 在執行到無效指令時,探測器不做任何操作而繼續執行下一指令。
【編程實現】
根據給定的 h、s 和一個指令序列(由字符 u、d 組成的字符串,長度不超過 100),求出執行完整的指令序列后,探測器的水下深度。
【輸入格式】
第一行:h 和 s,以空格分開(0 ≤ s ≤ h ≤ 100);
第二行:長度不超過 100 的指令字符串,串中僅包含字母 u 或 d。
【輸出格式】
代表探測器在執行指令后的水下深度的數字。
【輸入樣例#1】
9 1
uduudd
【輸出樣例#1】
2
【題目分析】題目考查基礎語法、字符串、循環、條件判斷。題目相對簡單,我們需要依次處理每個指令,根據情況調整探測器的當前深度即可。
1#include?2#include?
3using?namespace?std;
4
5int?main() 6{
7????int?h,?s;
8????string?str;
9????//?讀入水深、探測器的初始位置和指令字符串
10????cin?>>?h?>>?s?>>?str;
11????//?依次處理每個指令
12????for?(int?i?=?0;?i?<=?str.length()?-?1;?i++)?
13????{
14????????//?對于指令'u',如果不在水面,讓探測器上浮
15????????if?(str[i]?==?'u'?&&?s?>?0)?
16????????{
17????????????s--;
18????????}
19????????//?對于指令'd',如果不在水底,讓探測器下沉
20????????if?(str[i]?==?'d'?&&?s?21????????{
22????????????s++;
23????????}
24????}
25????cout?<endl;?//?輸出答案
26????return?0;
27}
2
小貓吃魚
(滿分 50 分)
【原理】
明明家從 1 號站點出發,開車去旅游,一共要經過 n 個站點,依次為 2、3 ...... n。由于明明帶上了心愛的小貓,在每個站點都要為小貓提供一條魚用做美餐(包括 1 號站點)。
除了 1 號站點只能吃 1 號站點買的魚,其他站點既可以吃當地買的魚,也可吃之前經過的站點買了存入車載冰箱中的魚。?但車載冰箱消耗的電能來自汽油,所以每條魚用冰箱保存到下一站的費用與各個站點的汽油價格有關。為使問題簡化,我們約定:
(1)車從某站開出時油箱中都是此站點剛加的汽油;
(2)車載冰箱能容納一路上需要的所有魚。?即:每條魚的費用既包括購買時的費用,也包括用冰箱保存魚的費用。
【編程實現】
為了降低小貓吃魚的總代價,明明預先上網查到了這 n 個站點的魚價和汽油價格。并據此算出每個站點買一條魚的費用以及從該站點到下一站用冰箱保存一條魚的費用。你能幫明明算出這一路上小貓吃魚的最小總費用嗎?
【輸入格式】
第一行:站點數 n(1 < n < 100);
接下來的 n 行:每行兩個以空格分隔的正整數,表示這一站買一條魚的費用,以及從這一站把每條魚保存到下一站的費用,兩個費用均為小于 10000 的正整數。
【輸出格式】
最小總費用,是一個正整數。
【輸入樣例#1】
5
6 3
7 1
3 2
8 3
9 5
【輸出樣例#1】
29
【樣例分析】一共五站,對于第一站只能在此站購買,因此花費6;
對于第二站,可以在此站購買也可在前面的站購買,在此站購買花費7,在前面站購買的花費等于上一站最劃算的花費加上運到本站的油費6+3=9,因此選擇在本站購買;
對于第三站,可以在此站購買也可在前面的站購買,在此站購買花費3,在前面站購買的花費等于上一站最劃算的花費加上運到本站的油費7+1=8,因此選擇在本站購買;
……
因此,這一路上小貓吃魚的最小總費用是6+7+3+5+8=29。
【題目分析】題目考查數組及遞推算法。題目不難,需要我們在看懂題目描述的基礎上能讀懂輸入輸出樣例。分析題目我們會發現每一次我們總是在“當前站點的魚價格”和“上一站最劃算的花費+油費”中選取便宜的!
1#include?2using?namespace?std;
3
4//?a數組存儲每個站點的魚價
5//?b數組存儲每個站點的油費
6int?a[110],?b[110];
7
8int?main() 9{
10????int?n;
11????cin?>>?n;
12????//?n次循環輸入每個站點的魚價、油費
13????for?(int?i?=?1;?i?<=?n;?i++)?
14????{
15????????cin?>>?a[i]?>>?b[i];
16????}
17????//?變量minn用來存儲之前站點最劃算的花費
18????//?變量sum存儲這一路上的最小總費用
19????int?minn?=?99999,?sum?=?0;
20????for?(int?i?=?1;?i?<=?n;?i++)?
21????{
22????????if?(a[i]?//?當前站的魚價格更低
23????????{
24????????????minn?=?a[i];?//?更新最低花費
25????????}
26????????sum?+=?minn;?//?累加費用
27????????//?對于下一站,最低花費min需要加上油費
28????????minn?=?minn?+?b[i];?
29????}
30????cout?<endl;
31????return?0;
32}
3
評選最佳品牌
(滿分 50 分)
【原理】
n 個評委投票,在 m 個商品中評選一個最佳品牌。評選采用多輪淘汰制,即:每輪投票,淘汰掉得票最少的候選品牌(得票并列最少的品牌一起淘汰)。?如此一輪輪淘汰下去,如果最后只剩下一個品牌當選,即告評選成功。?但如果在某輪投票中,當時未被淘汰的所有候選品牌(大于等于兩個品牌)都并列得票最少,即告評選失敗。。)
如果評選成功就輸出當選品牌號。否則輸出最后一輪評選時唯一選票數的相反數。?在評選流程中,每個評委的態度都可用一個序列來表示;例如當 m = 5 時,某評委的評選態度序列為:3、5、1、2、4,則表示該評委:優先投 3 號,當 3 號被淘汰時投 5 號,當 3 和 5 都被淘汰時投 1,當 3、5、1 都?被淘汰時投 2,僅剩 4 號時才投 4 號品牌的票。
選票的序列中可以表示棄權,用?0 來表示,例如當 m = 5 時,某評委的評選態度序列為:3、5、0,則表示該評委:優先投 3 號,當 3 號被淘汰時投 5 號,其它情況下不投任何品牌的票。
【編程實現】
請你編一個程序,模擬各輪投票的過程,得到評選結果。
【輸入格式】
第一行:m(0 < m < 10,表示參加評選的品牌數)和 n(1 < n < 1000,表示參加投票的評委數),之間以空格分隔;
接下來的 n 行:每行都是長度不超 m 的數字字符串,每個字符串表示一個評委的評選態度。
【輸出格式】
評選結果。
【輸入樣例#1】
3 4
123
213
132
10
【輸出樣例#1】
1
【輸入樣例#2】
3 4
321
213
231
312
【輸出樣例#2】
-2
【題目分析】題目考查字符串、桶的思想以及模擬算法。需要孩子能夠模擬題目描述中的場景將其轉變為程序解決問題。
【解題思路】初始時,所有品牌都“活著”,模擬整個投票過程,直至“活著”的品牌數僅剩1或0。
對于每一輪投票,計算每個品牌的票數;初始時,所有品牌的票數歸零。
枚舉所有評委:對于每個評委的投票序列,通過枚舉找到第一個“活著”的品牌,將相應品牌的票數計1。
通過枚舉,找出“活著”的品牌中的最低票數,將得票數與最低票數相等的品牌“殺死”。
如果發現這輪結束時,“活著”的品牌數為0,則投票失敗,輸出最后唯一票數的相反數;
如果整個投票結束,還有1個品牌“活著”,則輸出對應品牌。
1#include?2#include?
3#include?
4using?namespace?std;
5
6int?n,?m;
7bool?alive[15];?//?記錄每個品牌是否“活著”
8string?vote[1005];?//?記錄每個評委的投票序列
9
10int?main()11{
12????//?讀入品牌數、評委數、每個評委的投票序列
13????cin?>>?m?>>?n;
14????for?(int?i?=?1;?i?<=?n;?i++)
15????{
16????????cin?>>?vote[i];
17????}
18
19????//?初始化所有品牌都“活著”,“活著”的總數為讀入的品牌數
20????memset(alive,?1,?sizeof(alive));
21????int?num?=?m;
22
23????while?(num?>?1)?//?模擬整個投票過程,直至“活著”的品牌數小于或等于1
24????{
25????????//?定義每個品牌的這一輪票數,初始化為0
26????????int?cnt[15];
27????????memset(cnt,?0,?sizeof(cnt));
28
29????????for?(int?i?=?1;?i?<=?n;?i++)?//?枚舉每個評委,唱票計數
30????????{
31????????????//?枚舉每個評委的投票序列,找出他這一輪會投給誰
32????????????for?(int?j?=?0;?j?33????????????{
34????????????????if?(vote[i][j]?==?'0')?//?這個評委棄權,因為心儀的品牌都“死”了
35????????????????{
36????????????????????break;
37????????????????}
38????????????????else
39????????????????{
40????????????????????//?如果當下枚舉到的品牌還“活著”,就投出莊嚴一票,后續品牌就不必考慮了
41????????????????????if?(alive[vote[i][j]?-?'0'])
42????????????????????{
43????????????????????????cnt[vote[i][j]?-?'0']++;?//?字符轉為數字,并投票
44????????????????????????break;
45????????????????????}
46????????????????}
47????????????}
48????????}
49
50????????//?找出這輪的最低票數
51????????int?least?=?n;
52????????//?通過枚舉,將“活著”的品牌的得票數與當下最低票數作比較
53????????for?(int?i?=?1;?i?<=?m;?i++)
54????????{
55????????????if?(alive[i]?&&?cnt[i]?56????????????????least?=?cnt[i];
57????????}
58
59????????//?通過枚舉,將得票數與這輪最低票數相等的品牌統統“殺死”
60????????for?(int?i?=?1;?i?<=?m;?i++)
61????????{
62????????????if?(alive[i]?&&?cnt[i]?==?least)
63????????????{
64????????????????alive[i]?=?false;
65????????????????num--;
66????????????}
67????????}
68
69????????//?這輪結束,“活著”的品牌數為0,則投票失敗,輸出最后唯一票數的相反數
70????????if?(num?==?0)
71????????{
72????????????cout?<endl;
73????????}
74????}
75
76????//?還有1個品牌“活著”,則通過枚舉,找到這個品牌并輸出
77????if?(num?==?1)
78????{
79????????for?(int?i?=?1;?i?<=?m;?i++)
80????????{
81????????????if?(alive[i])
82????????????{
83????????????????cout?<endl;
84????????????}
85????????}
86????}
87????return?0;
88}
學而思小猴編程—創造我的未來世界
小猴編程是學而思旗下的少兒編程品牌,通過編程學習,培養孩子的邏輯力,創造力,合作力,成為人工智能時代的未來創造者。
總結
以上是生活随笔為你收集整理的蓝桥杯单片机十一届省赛_“第十届蓝桥杯青少组C++省赛”前三题解题思路及参考答案!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用哪种食材腌制肉类,有助于肉质变嫩?蚂蚁
- 下一篇: android调用flutter aar