保证全对——2015年第六届蓝桥杯C/C++ B组部分解题报告
最近在備考藍橋杯,但網上的答案五花八門,甚至有很多題結果不正確就貼上去了,于是我整理了一份保對的答案和解析,分享給大家。 后續會填坑+更新,請持續關注。
1.結果填空 (滿分3分)
獎券數目
有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。
雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(10000-99999),要求其中不要出現帶“4”的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。
請提交該數字(一個整數),不要寫任何多余的內容或說明性文字。
解題思路:
直接五重循環爆破即可。
#include<bits/stdc++.h> using namespace std; int main() {int q,w,e,r,t, sum=0;for(q=1; q<=9; q++) for(w=0; w<=9; w++) for(e=0; e<=9; e++) for(r=0; r<=9; r++) for(t=0; t<=9; t++) if(q!=4 && w!=4 && e!=4 && r!=4 && t!=4) sum++;cout << sum;return 0; }2.結果填空 (滿分5分)
星系炸彈
在X星系的廣袤空間中漂浮著許多X星人造“炸彈”,用來作為宇宙中的路標。
每個炸彈都可以設定多少天之后爆炸。
比如:阿爾法炸彈2015年1月1日放置,定時為15天,則它在2015年1月16日爆炸。
有一個貝塔炸彈,2014年11月9日放置,定時為1000天,請你計算它爆炸的準確日期。
請填寫該日期,格式為 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
請嚴格按照格式書寫。不能出現其它文字或符號。
解題思路:
解法一:采用程序做計算器+手算
解法二:使用Excel工具
3.結果填空 (滿分9分)
三羊獻瑞
觀察下面的加法算式:
(如果有對齊問題,可以參看【圖1.jpg】)
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多余內容。
解題思路:
已知不同的字代表不同的數組,則可確定共有8個未知數
解法一:暴力法:八重循環,同時if判斷互不相等,無腦就完事了,快還方便。
#include<stdio.h> using namespace std; int main() {int q,w,e,r,t,y,u,i;for(q = 0; q <= 9; q++) {for(w = 0; w <= 9; w++) {for(e = 0; e <= 9; e++) {for(r = 0; r <= 9; r++) {for(t = 0; t <= 9; t++) {for(y = 0; y <= 9; y++) {for(u = 0; u <= 9; u++) {for(i = 0; i <= 9; i++) {if(q!=w && q!=e && q!=r && q!=t && q!=y && q!=u && q!=i && w!=e && w!=r && w!=t && w!=y && w!=u && w!=i && e!=r && e!=t && e!=y && e!=u && e!=i && r!=t && r!=y && r!=u && r!=i && t!=y && t!=u && t!=i && y!=u && y!=i && u!=i ) {if(q*1000 + w*100+e*10+r+t*1000+y*100+u*10+w==t*10000+y*1000+e*100+w*10+i) {printf("%d+%d=%d\n",q*1000+w*100+e*10+r, t*1000+y*100+u*10+w, t*10000+y*1000+e*100+w*10+i) ;}}}}}}}}}}return 0; }解法二:稍微推一推。 設出未知數,即:
首先可得e=1,因為兩個四位數相加得到的五位數,其萬位一定是1。
由于e等于1,則a必定=9。 理由同上。
由于a等于9,f必定等于0。 因為1+9=10,進位。
由于f等于0,而b+f還等于c,所以b+f一定接受了c+g的進位。 也就是說:b+1=c。
知道以上條件,則只需遍歷b, g, d, i即可。
PS:太磨嘰了 沒有直接暴力來得快。
4.代碼填空 (滿分11分)
格子中輸出
StringInGrid函數會在一個指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直兩個方向上都居中。
如果字符串太長,就截斷。
如果不能恰好居中,可以稍稍偏左或者偏上一點。
下面的程序實現這個邏輯,請填寫劃線部分缺少的代碼。
解題思路:
首先,我們注釋掉橫線處運行,得到:
說明該行填寫空格和字符串,
再看%*s,*代表數字,如:printf("%*s",3,buf); 代表輸出buf的前三位。
理解了這點后,做出這道題就很容易了,只需求出空格的長度即可, 結合題給中“偏左偏上”可得結果:printf("%*s%s%*s",(width-strlen(buf))/2-1,"",s,(width-strlen(buf))/2-1,"");
切記,一定要化簡。因為填空題答案是唯一的。
5.代碼填空 (滿分13分)
九數組分數
1,2,3…9 這九個數字組成一個分數,其值恰好為1/3,如何組法?
下面的程序實現了該功能,請填寫劃線部分缺失的代碼。
解題思路:
要求我們補全回溯的代碼。也就是說:修改了哪個地方,回溯結束后,就要改回來。
即:{t=x[k]; x[k]=x[i]; x[i]=t;}
6.結果填空 (滿分17分)(高分啊!)
加法變乘法
我們都知道:1+2+3+ … + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015就是符合要求的答案。
請你尋找另外一個可能的答案,并把位置靠前的那個乘號左邊的數字提交(對于示例,就是提交10)。
注意:需要你提交的是一個整數,不要填寫任何多余的內容。
解題思路:
題給中每個信息都要有效利用,那么1+2+…+49=1225有什么用呢, 可以定義num=1225。
接下來定義二重循環(像求最大子序列和一樣),i*(i+1)代表第一個乘數,j*(j+1)代表第二個乘數, 用1225加上他們,同時減去i,i+1,j,j+1這四個數。判斷是否等于2015即可。
7.結果填空 (滿分21分)(同高分!)
牌型種數
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子里突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先后順序,自己手里能拿到的初始牌型組合一共有多少種呢?
請填寫該整數,不要填寫任何多余的內容或說明文字。
解題思路:
直接暴力13重循環,判斷點數相加是否等于13即可。
#include<bits/stdc++.h> using namespace std; int main() {int q,w,e,r,t,y,u,i,o,p,a,s,d;int sum=0;for(q = 0; q <= 4; q++)for(w = 0; w <= 4; w++)for(e = 0; e <= 4; e++)for(r = 0; r <= 4; r++)for(t = 0; t <= 4; t++)for(y = 0; y <= 4; y++)for(u = 0; u <= 4; u++)for(i = 0; i <= 4; i++)for(o = 0; o <= 4; o++)for(p = 0; p <= 4; p++)for(a = 0; a <= 4; a++)for(s = 0; s <= 4; s++)for(d = 0; d <= 4; d++) if(q+w+e+r+t+y+u+i+o+p+a+s+d==13) sum++;cout << sum; return 0; }8.程序設計(滿分15分)
移動距離
X星球居民小區的樓房全是一樣的,并且按矩陣樣式排列。其樓房的編號為1,2,3…
當排滿一行時,從下一行相鄰的樓往反方向排號。
比如:當小區排號寬度為6時,開始情形如下:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 …
我們的問題是:已知了兩個樓號m和n,需要求出它們之間的最短移動距離(不能斜線方向移動)
輸入為3個整數w m n,空格分開,都在1到10000范圍內
w為排號寬度,m,n為待計算的樓號。
要求輸出一個整數,表示m n 兩樓間最短移動距離。
例如:
用戶輸入:
6 8 2
則,程序應該輸出:
4
再例如:
用戶輸入:
4 7 20
則,程序應該輸出:
5
資源約定:
峰值內存消耗 < 256M
CPU消耗 < 1000ms
解題思路:
首先提取題意,即讓我們求S型數組中,兩點坐標的x軸相對距離+y軸相對距離。
接下來考慮s型數組的規律,由于蛇形排列,但不影響y軸相對距離,于是先求y,也就是row(相隔行數)
很容易推出行數公式:w%m==0?row=w/m:row=w/m+1。
然后考慮列數col:我們發現:在奇數行中,數字從左至右為從小到大。偶數行相反。
因此分為兩種情況考慮:若為奇數行,其列數為:col=w-(w*row-m);
同理,若為偶數行,其列數為:col=(w*row-m)+1。 為什么加1呢,因為每行每列都是從1開始計數。
接下來展示代碼:
#include<cstdio> #include<iostream> #include<cmath> using namespace std; int main() {ios::sync_with_stdio(false);int w, m, n; while(cin >> w >> m >> n) {int rm = m%w==0? m/w : m/w+1; //行數 int rn = n%w==0? n/w : n/w+1;int cm, cn; //列數if(rm % 2 == 0) cm = rm*w-m + 1; //從1開始,所以+1else cm = w - (rm*w-m);if(rn % 2 == 0) cn = rn*w-n + 1; //從1開始,所以+1else cn = w - (rn*w-n);cout << abs(rm-rn)+abs(cm-cn) << endl; } return 0; }以上題全部A掉,理論上絕大多數省份都可以拿到省一了。
九題:待填坑
十題:待填坑
總結
以上是生活随笔為你收集整理的保证全对——2015年第六届蓝桥杯C/C++ B组部分解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14行代码AC_SCU 4440 Rec
- 下一篇: 给我往死里贪!——24行代码AC_今年暑