第十一屆藍橋杯決賽JavaC組真題——詳細答案對照(完整版)
目錄
A、美麗的 2
B、合數個數
C、擴散
D、階乘約數
E、本質上升序列
F、天干地支
G、皮亞諾曲線距離
H、藍肽子序列
I、畫廊
E、答疑
A、美麗的 2
本題總分:5 分
問題描述
小藍特別喜歡 2 ,今年是公元 2020 年,他特別高興。
他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少個年份的數位中包含數字 2 ?
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
package action; public class demo { public static void main(String[] args) { int sum = 0; for (int i = 0; i < 2021; i++) { int t = i; while (t > 0) { if (t % 10 == 2) { sum++; break; } t = t / 10; } } System.out.println(sum); } }
B、合數個數
本題總分:5 分
問題描述
一個數如果除了 1 和自己還有其他約數,則稱為一個合數。例如:1,2,3 不是合數,4,6 是合數。請問從 1 到 2020 一共有多少個合數。
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
package action; public class demo { public static void main(String[] args) { int sum = 0; for (int i = 1; i < 2021; i++) { for (int j = 2; j * j <= i; j++) { if (i % j == 0) { sum++; // System.out.print(i+" "); break; } } } System.out.println(sum); } }
C、擴散
本題總分:10 分
問題描述
小藍在一張無限大的特殊畫布上作畫。
這張畫布可以看成一個方格圖,每個格子可以用一個二維的整數坐標表示。
小藍在畫布上首先點了一下幾個點:(0,0),(2020,11),(11,14),(2000,2000)。只有這幾個格子上有黑色,其它位置都是白色的。
每過一分鐘,黑色就會擴散一點。具體的,如果一個格子里面是黑色,它就會擴散到上、下、左、右四個相鄰的格子中,使得這四個格子也變成黑色(如果原來就是黑色,則還是黑色)。
請問,經過 2020 分鐘后,畫布上有多少個格子是黑色的。
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
package action; public class demo { public static void main(String[] args) { int sum = 0; for (int x = -2020; x <= 2020 + 2020; x++) { for (int y = -2020; y <= 2000 + 2020; y++) { if (check(x, y)) { sum++; } } } System.out.println(sum); } private static boolean check(int x, int y) { if (Math.abs(x - 0) + Math.abs(y - 0) <= 2020) { return true; } if (Math.abs(x - 2020) + Math.abs(y - 11) <= 2020) { return true; } if (Math.abs(x - 11) + Math.abs(y - 14) <= 2020) { return true; } if (Math.abs(x - 2000) + Math.abs(y - 2000) <= 2020) { return true; } return false; } }
D、階乘約數
本題總分:10 分
問題描述
定義階乘 n!=1×2×3×???×n。
請問 100! (100 的階乘)有多少個約數。
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
package action; import java.util.ArrayList; public class demo { public static void main(String[] args) { int sum = 0; ArrayList
E、本質上升序列
本題總分:15 分
問題描述
小藍特別喜歡單調遞增的事物。
在一個字符串中,如果取出若干個字符,將這些字符按照在字符串中的順序排列后是單調遞增的,則成為這個字符串中的一個單調遞增子序列。
例如,在字符串 lanqiao 中,如果取出字符 n 和 q,則 nq 組成一個單調遞增子序列。類似的單調遞增子序列還有 lnq、i、ano 等等。
小藍發現,有些子序列雖然位置不同,但是字符序列是一樣的,例如取第二個字符和最后一個字符可以取到 ao,取最后兩個字符也可以取到 ao。
小藍認為他們并沒有本質不同。
對于一個字符串,小藍想知道,本質不同的遞增子序列有多少個?
例如,對于字符串 lanqiao,本質不同的遞增子序列有 21 個。它們分別是 l、a、n、q、i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、lnq、anq、lno、ano、aio。
請問對于以下字符串(共 200 個小寫英文字母,分四行顯示):(如果你把以下文字復制到文本文件中,請務必檢查復制的內容是否與文檔中的一致。在試題目錄下有一個文件 inc.txt,內容與下面的文本相同)
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf
iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij
gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad
vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl
本質不同的遞增子序列有多少個?
答案提交
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
package action; public class demo { static int dp[][] = new int[201][27]; public static void main(String[] args) { String str = "tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl"; for (int i = 1; i <= str.length(); i++) { for (int j = 0; j < 26; j++) { dp[i][j] = dp[i - 1][j]; if (str.charAt(i - 1) == 'a' + j) { dp[i][j] = 1; for (int k = 0; k < j; k++) { dp[i][j] += dp[i - 1][k]; } } } } int ans = 0; for (int j = 0; j < 26; j++) { ans += dp[str.length()][j]; } System.out.print(ans); } }
F、天干地支
時間限制: 1.0s 內存限制: 512.0MB 本題總分:15 分
問題描述
古代中國使用天干地支來記錄當前的年份。
天干一共有十個,分別為:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
地支一共有十二個,分別為:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)。
將天干和地支連起來,就組成了一個天干地支的年份,例如:甲子。
2020 年是庚子年。
每過一年,天干和地支都會移動到下一個。例如 2021 年是辛丑年。
每過 60 年,天干會循環 6 輪,地支會循環 5 輪,所以天干地支紀年每 60 年輪回一次。例如 1900 年,1960 年,2020 年都是庚子年。
給定一個公元紀年的年份,請輸出這一年的天干地支年份。
輸入格式
輸入一行包含一個正整數,表示公元年份。
輸出格式
輸出一個拼音,表示天干地支的年份,天干和地支都用小寫拼音表示(不表示聲調),之間不要加入任何多余的字符。
測試樣例1
Input:
2020
Output:
gengzi
評測用例規模與約定
對于所有評測用例,輸入的公元年份為不超過 9999 的正整數。
package action; public class demo { public static void main(String[] args) { int x = 1960; String s1[] = { "jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "gui" }; String s2[] = { "zi", "chou", "yin", "mao", "chen", "si", "wu", "wei", "shen", "you", "xu", "hai" }; int x1 = x % 10 + 6; int x2 = x % 12 - 4; System.out.println(s1[x1] + s2[x2]); } }
G、皮亞諾曲線距離
時間限制: 1.0s 內存限制: 512.0MB 本題總分:20 分
問題描述
皮亞諾曲線是一條平面內的曲線。
下圖給出了皮亞諾曲線的 1 階情形,它是從左下角出發,經過一個 3×3 的方格中的每一個格子,最終到達右上角的一條曲線。
(圖8-1)
下圖給出了皮亞諾曲線的 2 ?階情形,它是經過一個 3^2 × 3^2 (3的2次方乘以3的2次方)的方格中的每一個格子的一條曲線。它是將 1 階曲線的每個方格由 1 階曲線替換而成。
(圖8-2)
下圖給出了皮亞諾曲線的 3 33 階情形,它是經過一個3^3 × 3^3 (3的3次方乘以3的3次方)的方格中的每一個格子的一條曲線。它是將 2 ?階曲線的每個方格由 1 ?階曲線替換而成。
(圖8-3)
皮亞諾曲線總是從左下角開始出發,最終到達右上角。
我們將這些格子放到坐標系中,對于 k 階皮亞諾曲線,左下角的坐標是(0,0),右上角坐標是 (3^k?1, 3^k?1),右下角坐標是 (3^k?1,0),左上角坐標是(0, 3^k?1)。
給定 k 階皮亞諾曲線上的兩個點的坐標,請問這兩個點之間,如果沿著皮亞諾曲線走,距離是到少?
輸入格式
輸入的第一行包含一個正整數 k ,皮亞諾曲線的階數。
第二行包含兩個整數x1,y1,表示第一個點的坐標。
第三行包含兩個整數x2,y2,表示第二個點的坐標。
輸出格式
輸出一個整數,表示給定的兩個點之間的距離。
測試樣例1
Input:
1
0 0
2 2
Output:
8
測試樣例2
Input:
2
0 2
0 3
Output:
13
評測用例規模與約定
對于 30 3030% 的評測用例,0≤k≤10。
對于 50 5050% 的評測用例,0≤k≤20。
對于所有評測用例,0 ≤ k ≤ 100 , 0 ≤ x1 , y1 , x2 , y2 < 3^k , x1 , y1 , x2 , y2 ≤ 1 0^18 。
數據保證答案不超過 10^18。
package action; import java.util.Scanner; public class demo { public static void main(String[] args) { run(); } static long N = 450283905890997363L, ans = 0; static int[][] idx = { { 0, 1, 2 }, { 5, 4, 3 }, { 6, 7, 8 } }; public static void run() { Scanner sc = new Scanner(System.in); sc.next(); long x1 = sc.nextLong(); long y1 = sc.nextLong(); long x2 = sc.nextLong(); long y2 = sc.nextLong(); sc.close(); boolean sign1 = true, sign2 = true, turn1, turn2; int offset1, offset2; for (int i = 38; i > 0; i--) { offset1 = idx[(int) (x1 / N)][(int) (y1 / N)]; offset2 = idx[(int) (x2 / N)][(int) (y2 / N)]; turn1 = (offset1 & 1) == 1; turn2 = (offset2 & 1) == 1; if (x1 / N == 1) { offset1++; if (sign1) ans--; else ans++; } if (x2 / N == 1) { offset2++; if (sign2) ans++; else ans--; } ans += ((sign1 ? offset1 : -offset1) - (sign2 ? offset2 : -offset2)) * N * N; if (x1 / N == 1) sign1 = !sign1; if (x2 / N == 1) sign2 = !sign2; if (turn1) x1 = N - x1 % N - 1; else x1 %= N; if (turn2) x2 = N - x2 % N - 1; else x2 %= N; y1 %= N; y2 %= N; N /= 3; } System.out.println(ans > 0 ? ans : -ans); } }
H、藍肽子序列
時間限制: 1.0s 內存限制: 512.0MB 本題總分:20 分
問題描述
L 星球上的生物由蛋藍質組成,每一種蛋藍質由一類稱為藍肽的物資首尾連接成一條長鏈后折疊而成。
生物學家小喬正在研究 L 星球上的蛋藍質。她拿到兩個蛋藍質的藍肽序列,想通過這兩條藍肽序列的共同特點來分析兩種蛋藍質的相似性。
具體的,一個藍肽可以使用 1 至 5 個英文字母表示,其中第一個字母大寫,后面的字母小寫。一個蛋藍質的藍肽序列可以用藍肽的表示順序拼接而成。
在一條藍肽序列中,如果選取其中的一些位置,把這些位置的藍肽取出,并按照它們在原序列中的位置擺放,則稱為這條藍肽的一個子序列。藍肽的子序列不一定在原序列中是連續的,中間可能間隔著一些未被取出的藍肽。
如果第一條藍肽序列可以取出一個子序列與第二條藍肽序列中取出的某個子序列相等,則稱為一個公共藍肽子序列。
給定兩條藍肽序列,找出他們最長的那個公共藍肽子序列的長度。
輸入格式
輸入兩行,每行包含一個字符串,表示一個藍肽序列。字符串中間沒有空格等分隔字符。
輸出格式
輸出一個整數,表示最長的那個公共藍肽子序列的長度。
測試樣例1
Input:
LanQiaoBei
LanTaiXiaoQiao
Output:
2
Explanation:
最長的公共藍肽子序列為 LanQiao,共兩個藍肽。
評測用例規模與約定
對于 20% 的評測用例,兩個字符串的長度均不超過 20。
對于 50% 的評測用例,兩個字符串的長度均不超過 100。
對于所有評測用例,兩個字符串的長度均不超過 1000。
package action; import java.util.HashSet; import java.util.Scanner; public class demo { public static void main(String[] args) { HashSet
I、畫廊
時間限制: 1.0s 內存限制: 512.0MB 本題總分:25 分
問題描述
小藍辦了一個畫展,在一個畫廊左右兩邊陳列了他自己的作品。為了使畫展更有意思,小藍沒有等距陳列自己的作品,而是按照更有藝術感的方式陳列。
在畫廊的左邊陳列了 L 幅作品,在畫廊的右邊陳列了 R 幅作品,左邊的作品距離畫廊的起點依次為 u1, u2, · · · , uL,右邊的作品距離畫廊起點依次為 v1, v2, · · · , vR。
每周,小藍要整理一遍自己的每一幅作品。整理一幅作品的時間是固定的,但是要帶著沉重的工具。從一幅作品到另一幅作品之間的距離為直線段的長度。
小藍從畫廊的起點的正中央(左右兩邊的中點)出發,整理好每一幅畫,最終到達畫廊的終點的正中央。已知畫廊的寬為 w。
請問小藍最少帶著工具走多長的距離?
輸入格式
輸入的第一行包含四個整數 L , R , d , w,表示畫廊左邊和右邊的作品數量,以及畫廊的長度和寬度。
第二行包含 L 個正整數 u1, u2, · · · , uL,表示畫廊左邊的作品的位置。
第三行包含 R 個正整數 v1, v2, · · · , vR,表示畫廊右邊的作品的位置。
輸出格式
輸出一個實數,四舍五入保留兩位小數,表示小藍最少帶著工具走的距離。
測試樣例1
Input:
3 3 10 2
1 3 8
2 4 6
Output:
14.71
Explanation:
小藍從起點開始,首先到達左邊第一幅作品(走動距離 √2),然后到達左
邊第二幅作品(走動距離 2),然后到達右邊第一幅作品(走動距離 √5),然后
到達右邊第二幅和第三幅作品(走動距離 2 和 2),然后到達左邊第三幅作品(走動距離 2√2),最后到達畫廊終點(走動距離 √5)。
總共距離為 √2 + 2 + √5 + 2 + 2 + 2 √2 + √5 ≈ 14.71。
評測用例規模與約定
對于 40% 的評測用例,1≤L,R≤10,1≤d≤100,1≤w≤100。
對于 70% 的評測用例,1≤L,R≤100,1≤d≤1000,1≤w≤1000。
對于所有評測用例,1≤L,R≤500,1≤d≤100000,1≤w≤100000,0≤ u1 < u2 < ? ? ? < uL ≤ d , 0 ≤ v1 package action; import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int L = sc.nextInt(); int R = sc.nextInt(); double d = sc.nextDouble(); double w = sc.nextDouble(); double l[] = new double[L]; double r[] = new double[R]; for (int i = 0; i < l.length; i++) { l[i] = sc.nextDouble(); } for (int i = 0; i < r.length; i++) { r[i] = sc.nextDouble(); } double dp[][][] = new double[L + 1][R + 1][2]; for (int i = 0; i < dp.length; i++) { for (int j = 0; j < dp[0].length; j++) { dp[i][j][0] = dp[i][j][1] = Integer.MAX_VALUE; } } dp[1][0][0] = Math.sqrt((w / 2 * w / 2) + (l[0] * l[0])); for (int i = 2; i <= L; i++) { dp[i][0][0] = dp[i - 1][0][0] + l[i - 1] - l[i - 2]; } for (int i = 2; i <= R; i++) { dp[0][i][1] = dp[0][i - 1][1] + r[i - 1] - r[i - 2]; } dp[0][1][1] = Math.sqrt((w / 2 * w / 2) + (r[0] * r[0])); for (int i = 1; i <= L; i++) { for (int j = 1; j <= R; j++) { double t = Math.sqrt(w * w + Math.abs(l[i - 1] - r[j - 1]) * Math.abs(l[i - 1] - r[j - 1])); if (i - 2 < 0) { dp[i][j][0] = dp[i - 1][j][1] + t; } else { dp[i][j][0] = Math.min(dp[i - 1][j][0] + l[i - 1] - l[i - 2], dp[i - 1][j][1] + t); } if (j - 2 < 0) { dp[i][j][1] = dp[i][j - 1][0] + t; } else { dp[i][j][1] = Math.min(dp[i][j - 1][1] + r[j - 1] - r[j - 2], dp[i][j - 1][0] + t); } } } System.out.printf("%.2f", Math.min(dp[L][R][0] + Math.sqrt(w / 2 * w / 2 + (d - l[l.length - 1]) * (d - l[l.length - 1])), dp[L][R][1] + Math.sqrt(w / 2 * w / 2 + (d - r[r.length - 1]) * (d - r[r.length - 1])))); } } E、答疑 時間限制: 3.0s 內存限制: 512.0MB 本題總分:25 分 問題描述 有 n 位同學同時找老師答疑。每位同學都預先估計了自己答疑的時間。 老師可以安排答疑的順序,同學們要依次進入老師辦公室答疑。 一位同學答疑的過程如下: 1. 首先進入辦公室,編號為 i 的同學需要 si 毫秒的時間。 2. 然后同學問問題老師解答,編號為 i 的同學需要 ai 毫秒的時間。 3. 答疑完成后,同學很高興,會在課程群里面發一條消息,需要的時間可以忽略。 4. 最后同學收拾東西離開辦公室,需要 ei 毫秒的時間。一般需要 10 秒、20 秒或 30 秒,即 ei 取值為 10000,20000 或 30000。 一位同學離開辦公室后,緊接著下一位同學就可以進入辦公室了。 答疑從 0 時刻開始。老師想合理的安排答疑的順序,使得同學們在課程群里面發消息的時刻之和最小。 輸入格式 輸入第一行包含一個整數 n ,表示同學的數量。 接下來 n 行,描述每位同學的時間。其中第 i ii 行包含三個整數si,ai,ei,意義如上所述。 輸出格式 輸出一個整數,表示同學們在課程群里面發消息的時刻之和最小是多少。 測試樣例1 Input: 3 10000 10000 10000 20000 50000 20000 30000 20000 30000 Output: 280000 Explanation: 按照 1, 3, 2 的順序答疑,發消息的時間分別是 20000, 80000, 180000。 評測用例規模與約定 對于 30 3030% 的評測用例,1 ≤ n ≤ 20。 對于 60 6060% 的評測用例,1 ≤ n ≤ 200。 對于所有評測用例,1 ≤ n ≤ 1000 ,1 ≤ s i ≤ 60000 ,1 ≤ a i ≤ 1000000 ,e i ∈ { 10000 , 20000 , 30000 } ,即 e i 一定是 10000 、 20000 、 30000 之一。 package action; import java.util.Arrays; import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long num[][] = new long[n][3]; for (int i = 0; i < n; i++) { num[i][0] = sc.nextLong(); num[i][1] = sc.nextLong(); num[i][2] = sc.nextLong(); } long num3[] = new long[n]; long num2[] = new long[n]; for (int i = 0; i < n; i++) { num3[i] = num[i][0] + num[i][1] + num[i][2]; num2[i] = num[i][0] + num[i][1]; } Arrays.sort(num2); Arrays.sort(num3); long count = 0; for (int i = 0; i < n; i++) { count += num2[i]; } for (int i = 0, j = n - 1; i < n; i++, j--) { count += num3[i] * j; } System.out.println(count); } } Java 單片機
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。