2016第七届蓝桥杯省赛C/C++ B组试题解析整理
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                2016第七届蓝桥杯省赛C/C++ B组试题解析整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                引言
今天是藍橋杯省賽舉辦的日子,是一個很激動人心的時刻,也是我第一次參加藍橋杯,從上午9點到下午1點,做題時間歷經4個小時,想想就過癮。
下面整理一下這次比賽的題目。
*注:此處為了省事兒,全是用JAVA代碼寫的 ^_^
原題再現
1. 煤球數目
煤球數目有一堆煤球,堆成三角棱錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100層,共有多少個煤球?請填表示煤球總數目的數字。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 /*這個問題其實很簡單,但是可能表達上不是很清楚,其實意思就是,每一層放一個堆成三角棱錐形,就像如下:# 第一層------## # 第二層------## # 第三層# # # 所以需要把第一層的數量算出來,再把這100層的求和。第n層的數量:A[n] = A[n-1] + n*/ public class Main {public static void main(String[] args) {int[] arrLayer = new int[101];int sum = 0;for (int i = 1; i <= 100; i++) {arrLayer[i] = arrLayer[i-1] + i; }for (int i = 1; i <= 100; i++) {sum += arrLayer[i];}System.out.println(sum);}}答案:171700
2. 生日蠟燭
生日蠟燭某君從某年開始每年都舉辦一次生日party,并且每次都要吹熄與年齡相同根數的蠟燭?,F在算起來,他一共吹熄了236根蠟燭。請問,他從多少歲開始過生日party的?請填寫他開始過生日party的年齡數。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 /* 這個題目很簡單,不用講究什么算法,直接爆破就行*/ public class Main {public static void main(String[] args) {for (int i = 1; i <= 236; i++) {int sum = 0;for (int j = i; j <= 236; j++) {sum += j;if (sum == 236) {System.out.println(i);return;}else if(sum > 236){break;}}}}}答案:26
3. 湊算式
湊算式B DEF A + --- + ------- = 10C GHI(如果顯示有問題,可以參見【圖1.jpg】)這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。比如: 6+8/3+952/714 就是一種解法, 5+3/1+972/486 是另一種解法。這個算式一共有多少種解法?注意:你提交應該是個整數,不要填寫任何多余的內容或說明性文字。A+BC+DEFGHI=10 /* 直接用全排序,暴力測試就行,這里全用DFS。 這個題目關鍵在于處理精度的問題上,直接轉成double就行*/ public class Main {static int[] num = new int[10];static boolean[] book = new boolean[10]; //游標static int ans = 0;static void solve(){if (num[1] + (double)num[2]/num[3] + (double)(num[4]*100+num[5]*10+num[6])/(num[7]*100+num[8]*10+num[9])== 10) {ans++;}}static void dfs(int index){if (index == 10) {solve();return;}for (int i = 1; i <= 9; i++) {if(!book[i]){book[i] = true;num[index] = i;dfs(index+1);book[i] = false;}}}public static void main(String[] args) {dfs(1);System.out.println(ans);}}
答案:29
4. 快速排序
快速排序排序在各種場合經常被用到。 快速排序是十分常用的高效率的算法。其思想是:先選一個“標尺”, 用它把整個隊列過一遍篩子, 以保證:其左邊的元素都不大于它,其右邊的元素都不小于它。這樣,排序問題就被分割為兩個子區間。 再分別對子區間排序就可以了。下面的代碼是一種實現,請分析并填寫劃線部分缺少的代碼。#include <stdio.h>void swap(int a[], int i, int j) {int t = a[i];a[i] = a[j];a[j] = t; }int partition(int a[], int p, int r) {int i = p;int j = r + 1;int x = a[p];while(1){while(i<r && a[++i]<x);while(a[--j]>x);if(i>=j) break;swap(a,i,j);}______________________;return j; }void quicksort(int a[], int p, int r) {if(p<r){int q = partition(a,p,r);quicksort(a,p,q-1);quicksort(a,q+1,r);} }int main() {int i;int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};int N = 12;quicksort(a, 0, N-1);for(i=0; i<N; i++) printf("%d ", a[i]);printf("\n");return 0; }注意:只填寫缺少的內容,不要書寫任何題面已有代碼或說明性文字。這個題目就是送分的,熟悉快速排序的直接就能填寫上。 
 答案:swap(a,p,j)
5. 抽簽
抽簽X星球要派出一個5人組成的觀察團前往W星。 其中: A國最多可以派出4人。 B國最多可以派出2人。 C國最多可以派出2人。 ....那么最終派往W星的觀察團會有多少種國別的不同組合呢?下面的程序解決了這個問題。 數組a[] 中既是每個國家可以派出的最多的名額。 程序執行結果為: DEFFF CEFFF CDFFF CDEFF CCFFF CCEFF CCDFF CCDEF BEFFF BDFFF BDEFF BCFFF BCEFF BCDFF BCDEF .... (以下省略,總共101行)#include <stdio.h> #define N 6 #define M 5 #define BUF 1024void f(int a[], int k, int m, char b[]) {int i,j;if(k==N){ b[M] = 0;if(m==0) printf("%s\n",b);return;}for(i=0; i<=a[k]; i++){for(j=0; j<i; j++) b[M-m+j] = k+'A';______________________; //填空位置} } int main() { int a[N] = {4,2,2,1,1,3};char b[BUF];f(a,0,M,b);return 0; }仔細閱讀代碼,填寫劃線部分缺少的內容。注意:不要填寫任何已有內容或說明性文字。這里主要看一下f(int a[], int k, int m, char b[])函數,a[]是每個國家最多派出的人數,k表示當前是哪個國家,m表示還需要派送幾個人,b[]表示已經派送人的字符串。 
 第一個循環是第k個國家從0~a[k]個中指派人員。 
 答案:f(a, k+1, m-i, b)
6. 方格填數
方格填數如下的10個格子+--+--+--+| | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+(如果顯示有問題,也可以參看【圖1.jpg】)填入0~9的數字。要求:連續的兩個數字不能相鄰。 (左右、上下、對角都算相鄰)一共有多少種可能的填數方案?請填寫表示方案數目的整數。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 /** 這個題目還是采用全排序的方式進行序列組合,然后逐個測試*/ public class Main {static int[][] map = new int[3][4]; //填數地圖static boolean[][] flag = new boolean[3][4]; //地圖可用標志static boolean[] book = new boolean[10]; //0-9數字使用標志static int ans; static void solve(){int[][] dir = new int[][]{{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};boolean mFlag = true;for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {if (!flag[i][j]) continue;for (int k = 0; k < 8; k++) {int x, y;x = i + dir[k][0];y = j + dir[k][1];if(x<0 || y<0 || x>=3 || y>=4 || !flag[x][y]) continue;if(Math.abs(map[i][j] - map[x][y]) == 1) {mFlag = false;return;} }}}if (mFlag) {ans++;}}static void dfs(int index){ //index表示第幾個格子int x,y;x = index / 4; //格子行y = index % 4; //格子列if (x == 3) { //越界 回退solve();return;}if (flag[x][y]) {for (int i = 0; i <= 9; i++) {if (!book[i]) {book[i] = true;map[x][y] = i;dfs(index + 1);book[i] = false;}}}else{dfs(index + 1);}}public static void main(String[] args) {//地圖可用標志 初始化for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {flag[i][j] = true;} }flag[0][0] = flag[2][3] = false;dfs(0);System.out.println(ans);}}答案:1580
7. 剪郵票
剪郵票如【圖1.jpg】, 有12張連在一起的12生肖的郵票。 現在你要從中剪下5張來,要求必須是連著的。 (僅僅連接一個角不算相連) 比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 /** 這個題目還是采用全排序的方式進行序列組合,然后逐個測試* 全排序好做,關鍵在于檢測函數*/ import java.util.Arrays;public class Main {//----生成全序列專用---static boolean[] visit = new boolean[13]; //12個數字的使用標記static int[] num = new int[6]; //5個box//----檢測函數專用—---static int[][] map = new int[3][4]; //地圖static boolean[][] mapVisit = new boolean[3][4]; //標記是否已檢測此點static int count; //記數,是否5連static int[][] dir = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};static int ans;static void init(){int k = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++) {map[i][j] = ++k;}}}static void solveInner(int x, int y){int tX, tY;for (int i = 0; i < 4; i++) {tX = x + dir[i][0];tY = y + dir[i][1];if (tX < 0 || tY < 0 || tX >= 3 || tY >= 4) continue; //越界檢測if (!visit[map[tX][tY]] || mapVisit[tX][tY]) continue; //此點數值是否加入,或已檢測count++;mapVisit[tX][tY] = true;solveInner(tX, tY);}}static void solve(){for (int i = 0; i < mapVisit.length; i++) {Arrays.fill(mapVisit[i], false);} //掃描地圖for (int i = 0; i < 12; i++) {int x,y;x = i / 4;y = i % 4;//找到第一個使用的數字if (visit[map[x][y]]) {count = 1;mapVisit[x][y] = true;//內函數,通過無限遞歸判斷是否連同solveInner(x, y);break;}}if (count == 5) {ans++;}}static void dfs(int index){ //index表示第幾個數if (index == 6) {solve();return;}for (int i = num[index - 1] + 1; i <= 12; i++) { //num[index - 1]防止出現相同的序列if (!visit[i]) {visit[i] = true;num[index] = i;dfs(index + 1);visit[i] = false;}}}public static void main(String[] args) {init();dfs(1);System.out.println(ans);}}答案:116
8. 四平方和
四平方和四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符號表示乘方的意思)對于一個給定的正整數,可能存在多種平方和的表示法。 要求你對4個數排序: 0 <= a <= b <= c <= d 并對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最后輸出第一個表示法程序輸入為一個正整數N (N<5000000) 要求輸出4個非負整數,按從小到大排序,中間用空格分開例如,輸入: 5 則程序應該輸出: 0 0 1 2再例如,輸入: 12 則程序應該輸出: 0 2 2 2再例如,輸入: 773535 則程序應該輸出: 1 1 267 838資源約定: 峰值內存消耗 < 256M CPU消耗 < 3000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。 import java.util.Scanner;/** 方法一:4層循環爆破,O(n^4),時間可能會超時*/public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();for (int i = 0; i < Math.sqrt(n); i++) {for (int j = 0; j < Math.sqrt(n); j++) {for (int k = 0; k < Math.sqrt(n); k++) {for (int l = 0; l < Math.sqrt(n); l++) {if (i*i + j*j + k*k + l*l == n) {System.out.println(i + " " + j + " " + k + " " + l);return;}}}}}} } import java.util.Scanner;/** 方法二:3層循環 + 1層判斷,O(n^3 / 2),時間比方法一要快*/public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();for (int i = 0; i < Math.sqrt(n); i++) {for (int j = 0; j < Math.sqrt(n); j++) {for (int k = 0; k < Math.sqrt(n); k++) {double tmp = Math.sqrt(n - i*i - j*j - k*k);if (tmp == (int)tmp) {System.out.println(i + " " + j + " " + k + " " + (int)tmp);return;}}}}} }9. 交換瓶子
交換瓶子有N個瓶子,編號 1 ~ N,放在架子上。比如有5個瓶子: 2 1 3 5 4要求每次拿起2個瓶子,交換它們的位置。 經過若干次后,使得瓶子的序號為: 1 2 3 4 5對于這么簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過編程來解決。輸入格式為兩行: 第一行: 一個正整數N(N<10000), 表示瓶子的數目 第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。輸出數據為一行一個正整數,表示至少交換多少次,才能完成排序。例如,輸入: 5 3 1 2 5 4程序應該輸出: 3再例如,輸入: 5 5 4 3 2 1程序應該輸出: 2資源約定: 峰值內存消耗 < 256M CPU消耗 < 1000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。 /** 單獨開一個下標標記數組,挨個遍歷交換*/ import java.util.Scanner;public class Main {public static void main(String[] args) {int n, steps = 0;int[] arr, pos;Scanner in = new Scanner(System.in);n = in.nextInt();arr = new int[n + 1];pos = new int[n + 1];for (int i = 1; i <= n; i++) {arr[i] = in.nextInt();}for (int i = 1; i <= n; i++) {pos[arr[i]] = i;}for (int i = 1; i <= n; i++) {if (arr[i] != i) {int tmp = arr[i];arr[i] = arr[pos[i]];arr[pos[i]] = tmp;pos[tmp] = pos[i];pos[i] = i;steps++;}}System.out.println(steps);} }10. 最大比例
最大比例X星球的某個大獎賽設了M級獎勵。每個級別的獎金是一個正整數。 并且,相鄰的兩個級別間的比例是個固定值。 也就是說:所有級別的獎金數構成了一個等比數列。比如: 16,24,36,54 其等比值為:3/2現在,我們隨機調查了一些獲獎者的獎金數。 請你據此推算可能的最大的等比值。輸入格式: 第一行為數字N,表示接下的一行包含N個正整數(n<100) 第二行N個正整數Xi(Xi<1 000 000 000 000),用空格分開。每個整數表示調查到的某人的獎金數額要求輸出: 一個形如A/B的分數,要求A、B互質。表示可能的最大比例系數測試數據保證了輸入格式正確,并且最大比例是存在的。例如,輸入: 3 1250 200 32程序應該輸出: 25/4再例如,輸入: 4 3125 32 32 200程序應該輸出: 5/2再例如,輸入: 3 549755813888 524288 2程序應該輸出: 4/1資源約定: 峰值內存消耗 < 256M CPU消耗 < 3000ms請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。注意: main函數需要返回0 注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。 注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。提交時,注意選擇所期望的編譯器類型。博客名稱:王樂平博客
博客地址:http://blog.lepingde.com
CSDN博客地址:http://blog.csdn.net/lecepin
總結
以上是生活随笔為你收集整理的2016第七届蓝桥杯省赛C/C++ B组试题解析整理的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: SQL alter操作
 - 下一篇: Unity3D开发环境的搭建