2019第十届蓝桥杯省赛C/C++B组题解
作為很久很久沒有寫過算法題的考研狗 OvO(是這樣的,卑微考研),我于今年再次參加了藍橋杯...
大家都說這次藍橋杯簡單,我也是這么覺得的(或者說是我運氣好),或者說是考細節吧(雖然我也沒怎么考慮細節qwq),反正整個比賽的過程中心情感覺是放飛了自我(超級輕松)....
考完最開始在知乎上對了一波答案感覺涼的透徹,想著這次省三能不能拿到qwq,結果當成績出來的時候是省一...名次貌似也還不錯...這次抽空,想著馬上就要國賽了,多多練習一下題目,也把這次的吃面包之旅好好總結一哈~~~~
愛心是卑微的博主的成績(羞澀)
、
?
好了廢話不多說,各位扁桃體同學,下面看博主開始發炎了(來看看題目有多水)~~~
一、組隊
作為籃球隊教練,你需要從以下名單中選出 1 號位至 5 號位各一名球員,組成球隊的首發陣容。
每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位至 5 號位的評分之和最大可能是多少?
?
解答:最開始看到這題沒看清楚題意差點坑了,直接把所有的最大值加起來了...還好感覺后來不對勁想了我去...這個只能出5名同學,我一看,應該是dfs,但是感覺第一題簡單題啊我去,用啥dfs,直接目測一波。嗯,我就目測了一波。在紙上算了下,得出正確答案490。
答案: 490(注意不要算重復了)
?
二、年號字串
小明用字母A 對應數字1,B 對應2,以此類推,用Z 對應26。對于27以上的數字,小明用兩位或更長位的字符串來對應,例如AA 對應27,AB 對應28,AZ 對應52,LQ 對應329。
請問2019 對應的字符串是什么?
解答:這題腦子都不想動....最開始我以為字符串要求是升序字符串才合法,但是從題意驗證了一下發現BA這種也可以存在....然后瘋狂暴力,直接用筆算(不就是找個規律么,代碼都不想敲),10分鐘左右算出結果為BYQ。
但是為了大家方便看過程,附上代碼:
#include <bits/stdc++.h> using namespace std; //702 --> ZZ //703 --> AAA //18278 --> ZZZ //18279 --> AAAA void dfs(int N) {//并不是26進制喲if (N > 26) dfs((N - 1) / 26);putchar('A' + (N - 1) % 26); } int main() {int N;while (cin >> N) {dfs(N); cout << endl;}return 0; }答案: BYQ(注意...沒啥注意的有問題驗證題意就完事兒了)
?
三、數列求值
給定數列1, 1, 1, 3, 5, 9, 17, …,從第4 項開始,每項都是前3 項的和。求
第20190324 項的最后4 位數字。
解答:看到這個,很明顯如果暴力直接加肯定會爆掉,注意是最后4位數字,也就是說前面無論怎么騷,關最后4位數啥事兒呢?比如148665468797436465+4678646456465465465求最后4位數,前面再怎么花里胡哨也沒用吧qwq,我們只要求最后最后4位數相加就可以了,注意時刻對10000取模就完事兒了吧。
方法:打表取模。
#include<iostream> #include<algorithm> using namespace std; int main() {int a=1,b=1,c=1;int ans;for(int i=4;i<=20190324;i++){ans=(a+b+c)%10000;a=b%10000;b=c%10000;c=ans%10000;}cout<<ans<<endl; }答案:4659(注意取模)
?
四、數的分解
把2019 分解成3 個各不相同的正整數之和,并且要求每個正整數都不包含數字 2 和 4,一共有多少種不同的分解方法?
注意交換3個整數的順序被視為同一種方法,例如1000+1001+18 和 1001+1000+18 被視為同一種。
解答:直接三重循環打表判斷。
#include <bits/stdc++.h> using namespace std; bool isOK(int x) {for (/* */; x > 0; x /= 10)if (x % 10 == 2 || x % 10 == 4) return false;return true; } int main() {int N = 2019;int cnt = 0;for (int i = 1; i < N / 3; ++i)if (isOK(i))//k = N - i - j > jfor (int j = i + 1; N - i - j > j; ++j)if (isOK(j) && isOK(N - i - j)) ++cnt;cout << cnt << endl;return 0; }答案: 40785
?
五、 迷宮
前面4題對了,第5題最后一點時間沒dfs出來....最短路徑長度很熟練了,標記我硬是不知道用dfs怎么去標記(好了我太菜我已經知道了)。
下圖給出了一個迷宮的平面圖,其中標記為1 的為障礙,標記為0 的為可以通行的地方。
010000 000100 001001 110000迷宮的入口為左上角,出口為右下角,在迷宮中,只能從一個位置走到這個它的上、下、左、右四個方向之一。
對于上面的迷宮,從入口開始,可以按DRRURRDDDR 的順序通過迷宮,一共10 步。其中D、U、L、R 分別表示向下、向上、向左、向右走。對于下面這個更復雜的迷宮(30 行50 列),請找出一種通過迷宮的方式,其使用的步數最少,在步數最少的前提下,請找出字典序最小的一個作為答案。請注意在字典序中D<L<R<U。
等我抽空敲一下再上代碼。
?
六、特別數的和
小明對數位中含有 2、0、1、9 的數字很感興趣(不包括前導0),在1 到 40 中這樣的數包括1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。請問,在 1 到n 中,所有這樣的數的和是多少?
【輸入格式】
輸入一行包含兩個整數n。
【輸出格式】
輸出一行,包含一個整數,表示滿足條件的數的和。
【樣例輸入】
40
【樣例輸出】
574
【評測用例規模與約定】
對于20% 的評測用例,1≤n≤10 1 \leq n \leq 101≤n≤10。
對于50% 的評測用例,1≤n≤100 1 \leq n \leq 1001≤n≤100。
對于80% 的評測用例,1≤n≤1000 1 \leq n \leq 10001≤n≤1000。
對于所有評測用例,1≤n≤10000 1 \leq n \leq 100001≤n≤10000。
解答:無腦暴力枚舉。
#include<iostream> #include<algorithm> using namespace std; bool judge(int n) {while(n!=0){int k=n%10;if(k==2||k==0||k==1||k==9)return true;n=n/10;}return false; } int main() {int n;cin>>n;int ans=0;for(int i=1;i<=n;i++){if(judge(i)){ans+=i;}}cout<<ans<<endl; }?
明天繼續更新
?
總結
以上是生活随笔為你收集整理的2019第十届蓝桥杯省赛C/C++B组题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓之设计模式七大原则
- 下一篇: sql语句中select……as的用法