日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

保证全对——2015年第六届蓝桥杯C/C++ B组部分解题报告

發布時間:2024/2/28 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 保证全对——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函數會在一個指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直兩個方向上都居中。
如果字符串太長,就截斷。
如果不能恰好居中,可以稍稍偏左或者偏上一點。
下面的程序實現這個邏輯,請填寫劃線部分缺少的代碼。

#include <stdio.h> #include <string.h>void StringInGrid(int width, int height, const char* s) {int i,k;char buf[1000];strcpy(buf, s);if(strlen(s)>width-2) buf[width-2]=0;printf("+");for(i=0;i<width-2;i++) printf("-");printf("+\n");for(k=1; k<(height-1)/2;k++){printf("|");for(i=0;i<width-2;i++) printf(" ");printf("|\n");}printf("|");// printf("%*s%s%*s",(width-strlen(buf))/2-1,"",s,(width-strlen(buf))/2-1,""); //填空printf("|\n");for(k=(height-1)/2+1; k<height-1; k++){printf("|");for(i=0;i<width-2;i++) printf(" ");printf("|\n");} printf("+");for(i=0;i<width-2;i++) printf("-");printf("+\n"); }int main() {StringInGrid(20,6,"abcd1234");return 0; }
解題思路:

首先,我們注釋掉橫線處運行,得到:

說明該行填寫空格和字符串,

再看%*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,如何組法?
下面的程序實現了該功能,請填寫劃線部分缺失的代碼。

#include <stdio.h>void test(int x[]) {int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];if(a*3==b) printf("%d / %d\n", a, b); }void f(int x[], int k) {int i,t;if(k>=9){test(x);return;}for(i=k; i<9; i++){{t=x[k]; x[k]=x[i]; x[i]=t;}f(x,k+1);_____________________________________________ // 填空處} }int main() {int x[] = {1,2,3,4,5,6,7,8,9};f(x,0); return 0; }
解題思路:

要求我們補全回溯的代碼。也就是說:修改了哪個地方,回溯結束后,就要改回來
即:{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即可。

#include<bits/stdc++.h> using namespace std; int main() {for(int i = 1; i <= 48; i++) {for(int j = i+2; j <= 48; j++) {int num = 1225;num-=i; num-=i+1;num-=j; num-=j+1;num+=i*(i+1);num+=j*(j+1);if(num==2015) cout << i << endl; }} return 0;}

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组部分解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。