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