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