2015年 第6届 蓝桥杯 Java B组 省赛解析及总结
- 藍(lán)橋杯 Java B組 省賽決賽 真題詳解及小結(jié)匯總【2013年(第4屆)~2021年(第12屆)】
- 第11屆 藍(lán)橋杯-第1、2次模擬(軟件類)真題-(2020年3月、4月)-官方講解視頻
- 說明:部分題解思路及程序代碼 源自?藍(lán)橋杯 官網(wǎng)視頻(Java B組歷年真題解析)
目? ?錄
一、三角形面積
二、立方變自身
三、三羊獻(xiàn)瑞
四、循環(huán)節(jié)長度
五、九數(shù)組分?jǐn)?shù)
六、加法變乘法
七、牌型種數(shù)
八、飲料換購
九、壘骰子
矩陣乘法、矩陣快速冪
位運(yùn)算 快速求 i^n
十、生命之樹
小結(jié)
? ??
一、三角形面積
三角形面積
如【圖1】所示。圖中的所有小方格面積都是1。
圖1.jpg
那么,圖中的三角形面積應(yīng)該是多少呢?
請?zhí)顚懭切蔚拿娣e。不要填寫任何多余內(nèi)容或說明性文字。
【答案】:28
【解析】:8*8 - (8*2)/2 -?(4*6)/2?- (8*4)/2 = 64 - (8+12+16) =?64 - 36 = 28
package provincialGames_06_2015_JavaB;public class A01_三角形面積 { // 28public static void main(String[] args) {System.out.println(64 - 36); // 28System.out.println(8 * 8 - (8 * 2) / 2 - (4 * 6) / 2 - (8 * 4) / 2); // 28} // 12 8 16 }二、立方變自身
立方變自身
觀察下面的現(xiàn)象,某個數(shù)字的立方,按位累加仍然等于自身。
1^3 = 1?
8^3 ?= 512 ? ?5+1+2=8
17^3 = 4913 ? 4+9+1+3=17
...
請你計(jì)算包括1,8,17在內(nèi),符合這個性質(zhì)的正整數(shù)一共有多少個?
請?zhí)顚懺摂?shù)字,不要填寫任何多余的內(nèi)容或說明性的文字。
【答案】:6
簡單枚舉? ? ? ? ? i^3? ? ? ? ? ?99之后,數(shù)字越大,數(shù)字之和越不可能等于其自身。
package provincialGames_06_2015;public class A02_立方變自身 {private static int ans;public static void main(String[] args) { // 6for (int i = 1; i < 99; i++) {int i1 = i * i * i;int sum = sum(i1);if (sum == i) {System.out.println(i + " " + i1);ans++;}}System.out.println(ans);}private static int sum(int x) {String s = String.valueOf(x);int sum = 0;for (int i = 0; i < s.length(); i++) {sum += s.charAt(i) - '0';}return sum;} }三、三羊獻(xiàn)瑞
三羊獻(xiàn)瑞
觀察下面的加法算式:
? ? ? 祥 瑞 生 輝
? + ? 三 羊 獻(xiàn) 瑞
-------------------
? ?三 羊 生 瑞 氣
(如果有對齊問題,可以參看【圖1.jpg】)
圖1.jpg其中,相同的漢字代表相同的數(shù)字,不同的漢字代表不同的數(shù)字。
請你填寫“三羊獻(xiàn)瑞”所代表的4位數(shù)字(答案唯一),不要填寫任何多余內(nèi)容。
【答案】:1085
? ? ?a b c d
+ ? e f? g b
-------------------
? ? e f c b i
e=1、a=9、f=0、c=b+1、c+g>10
public class A03_三羊獻(xiàn)瑞 {public static void main(String[] args) {for (int b = 2; b < 9; ++b) {for (int d = 2; d < 9; ++d) {if (b == d)continue;for (int g = 2; g < 9; ++g) {if (g == b || g == d)continue;int c = b + 1;if (c == b || c == d || c == g)continue;if (c + g <= 10)continue;int sum = 9000 + b * 100 + c * 10 + d + 1000 + g * 10 + b;for (int i = 2; i < 9; ++i) {if (i == b || i == d || i == g || i == c)continue;if (sum <= (10000 + c * 100 + b * 10 + i) && sum >= (10000 + c * 100 + b * 10 + i)) {System.out.printf("%2d%d%d%d\n", 9, b, c, d);System.out.printf("%2d%d%d%d\n", 1, 0, g, b);System.out.printf("%d\n", sum);System.out.printf("---------\n");}}}}}} }四、循環(huán)節(jié)長度
循環(huán)節(jié)長度
兩個整數(shù)做除法,有時(shí)會產(chǎn)生循環(huán)小數(shù),其循環(huán)部分稱為:循環(huán)節(jié)。
比如,11/13=6=>0.846153846153..... ?其循環(huán)節(jié)為[846153] 共有6位。
下面的方法,可以求出循環(huán)節(jié)的長度。
請仔細(xì)閱讀代碼,并填寫劃線部分缺少的代碼。
?? ?public static int f(int n, int m)
?? ?{
?? ??? ?n = n % m;?? ?
?? ??? ?Vector v = new Vector();
?? ??? ?
?? ??? ?for(;;)
?? ??? ?{
?? ??? ??? ?v.add(n);
?? ??? ??? ?n *= 10;
?? ??? ??? ?n = n % m;
?? ??? ??? ?if(n==0) return 0;
?? ??? ??? ?if(v.indexOf(n)>=0) ?_________________________________ ; ?//填空
?? ??? ?}
?? ?}
注意,只能填寫缺少的部分,不要重復(fù)抄寫已有代碼。不要填寫任何多余的文字。
【答案】:return v.size() - v.indexOf(n)? ? ? ? ? ? ? ? ? ? ?Java Vector 類
邏輯? ? ? ?7/18 ≈ 0.3888...? ? ? ? ? ? ? 1/3? ? ?3/10? ? 11/13 ≈ 0.846153...
package provincialGames_06_2015;import java.util.Vector;public class A04_循環(huán)節(jié)長度 {public static int f(int n, int m) {n = n % m;Vector v = new Vector();for (;;) {v.add(n);n *= 10;n = n % m;if (n == 0)return 0;if (v.indexOf(n) >= 0)return v.size() - v.indexOf(n); // 填空}}public static void main(String[] args) {System.out.println(f(11, 13));System.out.println(f(7, 18));} }五、九數(shù)組分?jǐn)?shù)
九數(shù)組分?jǐn)?shù)
1,2,3...9 這九個數(shù)字組成一個分?jǐn)?shù),其值恰好為1/3,如何組法?
下面的程序?qū)崿F(xiàn)了該功能,請?zhí)顚憚澗€部分缺失的代碼。
public class A
{
?? ?public static 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) System.out.println(a + " " + b);
?? ?}
?? ?
?? ?public static void f(int[] x, int k)
?? ?{
?? ??? ?if(k>=x.length){
?? ??? ??? ?test(x);
?? ??? ??? ?return;
?? ??? ?}
?? ??? ?
?? ??? ?for(int i=k; i<x.length; i++){
?? ??? ??? ?{int t=x[k]; x[k]=x[i]; x[i]=t;}
?? ??? ??? ?f(x,k+1);
?? ??? ??? ?_______________________________________ ? ? ? // 填空
?? ??? ?}
?? ?}
?? ?
?? ?public static void main(String[] args)
?? ?{
?? ??? ?int[] x = {1,2,3,4,5,6,7,8,9};?? ??? ?
?? ??? ?f(x,0);
?? ?}
}
注意,只能填寫缺少的部分,不要重復(fù)抄寫已有代碼。不要填寫任何多余的文字。
【答案】:{int t=x[k]; x[k]=x[i]; x[i]=t;}? ? ? ? ? ??全排列 -->?2013年 第4屆 藍(lán)橋杯 Java B組 第九題 帶分?jǐn)?shù)
先縱后橫 --->?
package provincialGames_06_2015;public class A05_九數(shù)組分?jǐn)?shù) {public static 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)System.out.println(a + " " + b);}public static void f(int[] x, int k) {if (k >= x.length) {test(x);return;}for (int i = k; i < x.length; i++) {{int t = x[k];x[k] = x[i];x[i] = t;}f(x, k + 1);{int t = x[k];x[k] = x[i];x[i] = t;} // 填空}}public static void main(String[] args) {int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };f(x, 0);} }六、加法變乘法
加法變乘法
我們都知道:1+2+3+ ... + 49 = 1225
現(xiàn)在要求你把其中兩個不相鄰的加號變成乘號,使得結(jié)果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,并把位置靠前的那個乘號左邊的數(shù)字提交(對于示例,就是提交10)。
注意:需要你提交的是一個整數(shù),不要填寫任何多余的內(nèi)容。
【答案】:16
package provincialGames_06_2015;public class A06_加法變乘法 { // 簡單枚舉public static void main(String[] args) {for (int i = 1; i <= 46; i++) {for (int j = i + 2; j <= 48; j++) {if (i * (i + 1) - (i + i + 1) + j * (j + 1) - (j + j + 1) == 2015 - 1225)System.out.println(i + " " + j);}}} }七、牌型種數(shù)
牌型種數(shù)
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發(fā)給4個人,每個人13張。
這時(shí),小明腦子里突然冒出一個問題:
如果不考慮花色,只考慮點(diǎn)數(shù),也不考慮自己得到的牌的先后順序,自己手里能拿到的初始牌型組合一共有多少種呢?
請?zhí)顚懺撜麛?shù),不要填寫任何多余的內(nèi)容或說明文字。
【答案】:3598180
package provincialGames_06_2015_JavaB;public class A07_牌型種數(shù) {private static int ans;public static void main(String[] args) {f(0, 0);System.out.println(ans);}// 13堆牌,每堆4個, 每堆可選0到4個, 只要牌的總數(shù)為13即可// k: 哪種牌; cnt: 總共分配了幾張牌private static void f(int k, int cnt) {if (k > 13 || cnt > 13)return;if (k == 13 && cnt == 13) {ans++;return;}// cnt 每一種牌出現(xiàn)的次數(shù),cnt逐步上升// cnt==13,牌型種數(shù)+1,返回for (int i = 0; i < 5; i++) {f(k + 1, cnt + i);}} }八、飲料換購
飲料換購
樂羊羊飲料廠正在舉辦一次促銷優(yōu)惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,并且可以一直循環(huán)下去,但不允許賒賬。
請你計(jì)算一下,如果小明不浪費(fèi)瓶蓋,盡量地參加活動,那么,對于他初始買入的n瓶飲料,最后他一共能得到多少瓶飲料。
輸入:一個整數(shù)n,表示開始購買的飲料數(shù)量(0<n<10000)
輸出:一個整數(shù),表示實(shí)際得到的飲料數(shù)
例如:
用戶輸入:
100
程序應(yīng)該輸出:
149
用戶輸入:
101
程序應(yīng)該輸出:
151
資源約定:
峰值內(nèi)存消耗(含虛擬機(jī)) < 256M
CPU消耗 ?< 1000ms
請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
?
package provincialGames_06_2015_JavaB;import java.util.Scanner;public class A08_飲料換購 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int ans = 0;while (n >= 3) {n -= 2;ans += 3;}ans += n;System.out.println(ans);} }九、壘骰子
壘骰子
賭圣atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
經(jīng)過長期觀察,atm 發(fā)現(xiàn)了穩(wěn)定骰子的奧秘:有些數(shù)字的面貼著會互相排斥!
我們先來規(guī)范一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設(shè)有 m 組互斥現(xiàn)象,每組中的那兩個數(shù)字的面緊貼在一起,骰子就不能穩(wěn)定的壘起來。 atm想計(jì)算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當(dāng)且僅當(dāng)這兩種方式中對應(yīng)高度的骰子的對應(yīng)數(shù)字的朝向都相同。
由于方案數(shù)可能過多,請輸出模 10^9 + 7 的結(jié)果。
不要小看了 atm 的骰子數(shù)量哦~
「輸入格式」
第一行兩個整數(shù) n m
n表示骰子數(shù)目
接下來 m 行,每行兩個整數(shù) a b ,表示 a 和 b 不能緊貼在一起。
「輸出格式」
一行一個數(shù),表示答案模 10^9 + 7 的結(jié)果。
「樣例輸入」
2 1
1 2
「樣例輸出」
544
「數(shù)據(jù)范圍」
對于 30% 的數(shù)據(jù):n <= 5
對于 60% 的數(shù)據(jù):n <= 100
對于 100% 的數(shù)據(jù):0 < n <= 10^9, m <= 36
資源約定:
峰值內(nèi)存消耗(含虛擬機(jī)) < 256M
CPU消耗 ?< 2000ms
請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
? ?
矩陣乘法、矩陣快速冪
package provincialGames_06_2015_JavaB;import java.util.Scanner;public class A09_壘骰子 {static int op[] = new int[7];private static int n;private static int m;private static final long MOD = 1000000007;static void init() {op[1] = 4;op[4] = 1;op[2] = 5;op[5] = 2;op[3] = 6;op[6] = 3;}public static void main(String[] args) {init();Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();long conflict[][] = new long[6][6];for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {conflict[i][j] = 1;}}// 建立沖突矩陣for (int i = 0; i < m; i++) {int a = sc.nextInt();int b = sc.nextInt();conflict[op[a] - 1][b - 1] = 0;conflict[op[b] - 1][a - 1] = 0;}// 求沖突矩陣的n-1次方long[][] mPow_n_1 = mPow(conflict, n - 1);// 累加矩陣的每個元素long ans = 0;for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {ans = (ans + mPow_n_1[i][j]) % MOD;}}// ans*4^nSystem.out.println(ans * power(4, n) % MOD);}// 快速求 i^nprivate static long power(long i, int n) {long ans = 1;while (n != 0) {if ((n & 1) == 1) { // &:位與操作符(位運(yùn)算) 【(n & 1) == 1相當(dāng)于(n % 2) == 1】ans = (ans * i) % MOD;}i = i * i % MOD;n >>= 1; // 向右移動一位}return ans;}// 矩陣的快速冪private static long[][] mPow(long[][] conflict, int n) {long[][] e = new long[6][6]; // 初始化單位矩陣for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {if (i == j)e[i][j] = 1;elsee[i][j] = 0;}}while (n != 0) {if ((n & 1) == 1) {e = mMul(e, conflict);}conflict = mMul(conflict, conflict);n >>= 1;}return e;}// 矩陣乘法private static long[][] mMul(long[][] a, long[][] b) {long[][] ans = new long[6][6];for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {for (int k = 0; k < 6; k++) {ans[i][j] = (ans[i][j] + a[i][k] * b[k][j]) % MOD;}}}return ans;} }位運(yùn)算 快速求 i^n
package provincialGames_06_2015_JavaB;public class A09_位運(yùn)算快速求冪 {public static void main(String[] args) {System.out.println(power(1, 5)); // 1System.out.println(power(2, 5)); // 32System.out.println(power(5, 3)); // 125int n = 5;System.out.println(n >>= 1); // 2System.out.println(System.nanoTime()); // 納秒long factor = 1;for (int i = 0; i < 10; i++) { // 求2^10factor <<= 1;}System.out.println(factor); // 1024}private static long power(long i, int n) {long ans = 1;while (n != 0) {if ((n & 1) == 1) { // &:位與操作符(位運(yùn)算) 【(n & 1) == 1相當(dāng)于(n % 2) == 1】ans *= i; // ans = (ans * i)}i *= i;n >>= 1; // 向右移動一位}return ans;} }十、生命之樹
生命之樹
在X森林里,上帝創(chuàng)建了生命之樹。
他給每棵樹的每個節(jié)點(diǎn)(葉子也稱為一個節(jié)點(diǎn))上,都標(biāo)了一個整數(shù),代表這個點(diǎn)的和諧值。
上帝要在這棵樹內(nèi)選出一個非空節(jié)點(diǎn)集S,使得對于S中的任意兩個點(diǎn)a,b,都存在一個點(diǎn)列 {a, v1, v2, ..., vk, b} 使得這個點(diǎn)列中的每個點(diǎn)都是S里面的元素,且序列中相鄰兩個點(diǎn)間有一條邊相連。
在這個前提下,上帝要使得S中的點(diǎn)所對應(yīng)的整數(shù)的和盡量大。
這個最大的和就是上帝給生命之樹的評分。
經(jīng)過atm的努力,他已經(jīng)知道了上帝給每棵樹上每個節(jié)點(diǎn)上的整數(shù)。但是由于 atm 不擅長計(jì)算,他不知道怎樣有效的求評分。他需要你為他寫一個程序來計(jì)算一棵樹的分?jǐn)?shù)。
「輸入格式」
第一行一個整數(shù) n 表示這棵樹有 n 個節(jié)點(diǎn)。
第二行 n 個整數(shù),依次表示每個節(jié)點(diǎn)的評分。
接下來 n-1 行,每行 2 個整數(shù) u, v,表示存在一條 u 到 v 的邊。由于這是一棵樹,所以是不存在環(huán)的。
「輸出格式」
輸出一行一個數(shù),表示上帝給這棵樹的分?jǐn)?shù)。
「樣例輸入」
5
1 -2 -3 4 5
4 2
3 1
1 2
2 5
「樣例輸出」
8
「數(shù)據(jù)范圍」
對于 30% 的數(shù)據(jù),n <= 10
對于 100% 的數(shù)據(jù),0 < n <= 10^5, 每個節(jié)點(diǎn)的評分的絕對值不超過 10^6 。
資源約定:
峰值內(nèi)存消耗(含虛擬機(jī)) < 256M
CPU消耗 ?< 3000ms
請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內(nèi)容。
所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效代碼處理。
?
package provincialGames_06_2015_JavaB;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException;import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class A10_生命之樹 {private static int n;private static long[] w;private static List<Integer>[] g;private static long ans; // List<Integer>[] x = new ArrayList[n+1];public static void main(String[] args) throws FileNotFoundException {// System.setIn(new FileInputStream(new File("...")));// F:/Java/eclipse/workspace/zLanQiao/src/provincialGames_06_2015/data10/in4.txt// in4.txt 正常運(yùn)行;in5.txt 棧溢出// /Users/zhengwei/workspace/lanqiaobei2019/src/2015_Java_B/data10/in5.txtScanner sc = new Scanner(System.in);n = sc.nextInt();w = new long[n + 1];g = new ArrayList[n + 1];initG();for (int i = 1; i <= n; i++) {w[i] = sc.nextLong();}for (int i = 0; i < n - 1; i++) {int a = sc.nextInt();int b = sc.nextInt();g[a].add(b); // 無向的鄰接表 雙向g[b].add(a); // 有向圖 例外}dfs(1, 0);System.out.println(ans);}// u作為根所代表的子樹有一個最大權(quán)和,將其存儲在w[u]中private static void dfs(int u, int fa) {for (int i = 0; i < g[u].size(); i++) {Integer child = g[u].get(i);if (child == fa)continue;dfs(child, u);if (w[child] > 0)w[u] += w[child];}if (w[u] > ans)ans = w[u];}// 鄰接表 在Java中,一般用List來做, 數(shù)組List<Integer>[] g = new ArrayList[n+1];// 對象數(shù)組,只對 對象 進(jìn)行了 初始化, 還需要 對 數(shù)組元素 進(jìn)行初始化private static void initG() {for (int i = 0; i < n + 1; i++) {g[i] = new ArrayList<Integer>();}} }小結(jié)
01 三角形面積 熱身 不用編程
02 立方變自身 簡單枚舉
03 三羊獻(xiàn)瑞 簡單枚舉 小技巧
*04 循環(huán)節(jié)長度 有坑 邏輯
05 九數(shù)組分?jǐn)?shù) 全排列 帶分?jǐn)?shù)
06 加法變乘法 簡單枚舉 小技巧
07 牌型種數(shù) 遞歸
08 飲料換購 模擬
****09 壘骰子 遞歸-動規(guī)-矩陣快速冪
10 生命之樹 Java中遞歸最多1萬層
總結(jié)
以上是生活随笔為你收集整理的2015年 第6届 蓝桥杯 Java B组 省赛解析及总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java21-day12【网络编程(网络
- 下一篇: java美元兑换,(Java实现) 美元