- 藍橋杯 Java B組 省賽真題詳解及小結彙總【2013年(第4屆)~2020年(第11屆)】
- 注意:部分代碼及程式 源自 藍橋杯 官網視訊(曆年真題解析) 鄭未老師。
- 2013年 第04屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2014年 第05屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2015年 第06屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2016年 第07屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2017年 第08屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2018年 第09屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2019年 第10屆 藍橋杯 Java B組 省賽真題詳解及小結
- 2020年 第11屆 藍橋杯 第1次模拟賽真題詳解及小結(校内模拟)【Java版】
- 2020年 第11屆 藍橋杯 第2次模拟賽真題詳解及小結【Java版】
- 2020年 第11屆 藍橋杯 C/C++ B組 省賽真題詳解及小結【第1場省賽 2020.7.5】【Java版】
- 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2020.7.5】
- 2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.7.5】
- 第11屆 藍橋杯-第1、2次模拟(軟體類)真題-(2020年3月、4月)-官方講解視訊
目 錄
一、試題 A: 指數計算
解法一:使用“電腦”求解
解法二:大整數BigInteger
二、試題 B: 解密
解法一:手工計算
解法二:程式設計計算 indexOf()+substring()
三、試題 C: 跑步訓練
解法一:代碼+手工計算
解法二:純代碼
四、試題 D: 合并檢測
解法一
解法二
五、試題 E: REPEAT 程式
六、試題 F: 分類計數
七、試題 G: 整除序列
解法一:ArrayList(80分)
解法一:ArrayList改進
解法二:快速位運算(80分)
解法二:快速位運算改進
八、試題 H: 走方格
解法一:dp
解法二
解法三
解法四:dfs
九、試題 I: 字元串編碼
解法一(有誤!!!)
解法二
十、試題 J: 整數小拼接
小結
試題下載下傳:【連結:https://pan.baidu.com/s/1fQF12Oc-8ndZfXtmWrC26w 提取碼:zjxs】
一、試題 A: 指數計算
本題總分:5 分
【問題描述】
7 月 1 日是建黨日,從 1921 年到 2020 年,中國共産黨已經帶領中國人民 走過了 99 年。
請計算:
mod 1921,其中 A mod B 表示 A 除以 B 的餘數。
【答案送出】
這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。
【答案】:480
解法一:使用“電腦”求解
解法二:大整數BigInteger
package provincialGames_11_2020_1_C;
import java.math.BigInteger;
public class _01_指數計算 {
public static void main(String[] args) {
BigInteger a = new BigInteger("7");
BigInteger MOD = new BigInteger("1921");
a = a.pow(2020);
BigInteger b = a.mod(MOD);
System.out.println(b);
System.out.println(new BigInteger("7").pow(2020).mod(MOD));
System.out.println(new BigInteger("7").pow(2020).remainder(MOD));//大整數取模
}
}
二、試題 B: 解密
本題總分:5 分
【問題描述】
小明設計了一種文章加密的方法:對于每個字母 c,将它變成某個另外的字元 Tc。下表給出了字元變換的規則:
例如,将字元串 YeRi 加密可得字元串 EaFn。
小明有一個随機的字元串,加密後為
EaFnjISplhFviDhwFbEjRjfIBBkRyY
(由 30 個大小寫英文字母組成,不包含換行符),請問原字元串是多少?
(如果你把以上字元串和表格複制到文本檔案中,請務必檢查複制的内容是否與文檔中的一緻。在試題目錄下有一個檔案 str.txt,第一行為上面的字元串,後面 52 行依次為表格中的内容。)
【答案送出】
這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個隻包含 30 個大小寫英文字母的字元串,在送出答案時隻填寫這個字元串,填寫多餘的内容将無法得分。
【答案】:YeRikGSunlRzgDlvRwYkXkrGWWhXaA
解法一:手工計算
【解析】:觀察表可得:a->y、A->Y;建議:5個字母 5個字母地一一進行對比。
解法二:程式設計計算 indexOf()+substring()
package provincialGames_11_2020_1_C;
public class _02_解密 {
public static void main(String[] args) { // 30個字元
// String res = "YeRik GSunl RzgDl vRwYk XkrGW WhXaA"; // 未加密【答案】
// String str = "EaFnj ISplh FviDh wFbEj RjfIB BkRyY"; // 加密後
String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY"; // 加密後的字元
char[] arr = str.toCharArray();
String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 原字元
String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV"; // 加密後的字元
String s3 = ""; // 解密後的字元
for (int i = 0; i < arr.length; i++) {
int j = s2.indexOf(arr[i]); // 輸出目前字元在加密後字元中的位置
s3 += s1.substring(j, j + 1); // 找出原字元在此位置對應的字元
}
System.out.println(s3);
}
}
三、試題 C: 跑步訓練
本題總分:10 分
【問題描述】
小明要做一個跑步訓練。
初始時,小明充滿體力,體力值計為 10000。如果小明跑步,每分鐘損耗 600 的體力。如果小明休息,每分鐘增加 300 的體力。體力的損耗和增加都是均勻變化的。
小明打算跑一分鐘、休息一分鐘、再跑一分鐘、再休息一分鐘……如此循 環。如果某個時刻小明的體力到達 0,他就停止鍛煉。 請問小明在多久後停止鍛煉。為了使答案為整數,請以秒為機關輸出答案。 答案中隻填寫數,不填寫機關。 【答案送出】 這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個 整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。
【答案】:3880
解法一:代碼+手工計算
跑31分鐘後,還剩700體力。再跑一分鐘後,還剩100體力;休息1分鐘,還剩400體力。
此時,一共跑了32分鐘、剩400體力。即:32*2*60+40
package provincialGames_11_2020_1_C;
public class _01_跑步訓練 {
public static void main(String[] args) {
int count = 0;
for (int i = 10000; i >= 0; i -= 300) {
System.out.println(count++ + " : " + i);
}
System.out.println("31 * 2 * 60: " + 31 * 2 * 60);
System.out.println("32 * 2 * 60: " + 32 * 2 * 60);
}
}
解法二:純代碼
package provincialGames_11_2020_1_C;
public class _01_跑步訓練2 {
public static void main(String[] args) {
int target = 10000;
int count = 0;
boolean flag = true;
while (true) {
// 如果小于600體力并且需要跑步,證明這一分鐘跑不完
if (target < 600 && flag) {
break;
}
if (flag) {
target -= 600;
flag = false;
} else {
target += 300;
flag = true;
}
count++;
}
// System.out.println(count);
// 最後要求秒數,一分鐘花費600體力,一秒花費10體力,體力除10就是剩下的跑步時間
int time = count * 60 + target / 10;
System.out.println(time);
}
}
四、試題 D: 合并檢測
本題總分:10 分
【問題描述】
新冠疫情由新冠病毒引起,最近在 A 國蔓延,為了盡快控制疫情,A 國準備給大量群眾進病毒核酸檢測。
然而,用于檢測的試劑盒緊缺。
為了解決這一困難,科學家想了一個辦法:合并檢測。即将從多個人(k 個)采集的标本放到同一個試劑盒中進行檢測。如果結果為陰性,則說明這 k 個人都是陰性,用一個試劑盒完成了 k 個人的檢測。如果結果為陽性,則說明至少有一個人為陽性,需要将這 k 個人的樣本全部重新獨立檢測(從理論上看,如果檢測前 k − 1 個人都是陰性可以推斷出第 k 個人是陽性,但是在實際操作中不會利用此推斷,而是将 k 個人獨立檢測),加上最開始的合并檢測,一共使用了 k + 1 個試劑盒完成了 k 個人的檢測。
A 國估計被測的群眾的感染率大概是 1%,呈均勻分布。請問 k 取多少能最節省試劑盒?
【答案送出】
這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個 整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。
【答案】:10
解法一
這題數學問題
設總人數為pop,感染率p,每次k人,總市級數sum
sum = ( [pop / k]+1 ) * ( 1+k*p(k+1) )
這裡的[ pop / k ] + 1,即pop/k向上取整
[pop/k] + 1 這裡由于pop數量較大,是以這裡向上取整的1可以忽略,這裡直接取了pop/k,即
sum = ( pop / k ) * ( 1 + kp( k+1 ) )
将p代入sum = (pop/k)*( 1+k*0.01( k+1 ) )
sum求導 = ( pop/k ) ( 0.01k-1/k)
可得當k =10時,sum取最小值
是以K = 10。
解法二
原文連結
假設A國有n個人,感染者有n/100
每k個人一組,共n/k組,共用n/k瓶試劑
按照最壞的情況,每多出一個感染者就多用k瓶試劑,
是以共用n/k+(n/100)*k瓶試劑
n是定值,是以求(1/k+k/100)最小
由于a+b>=2√ab
當且僅當a = b時,取等号
即1/k=k/100時,取得最小值
解得k = 10
五、試題 E: REPEAT 程式
本題總分:10 分
【問題描述】
附件 prog.txt 中是一個用某種語言寫的程式。
其中 REPEAT k 表示一個次數為 k 的循環。循環控制的範圍由縮進表達,從次行開始連續的縮進比該行多的(前面的空白更長的)為循環包含的内容。
例如如下片段:
REPEAT 2:
A = A + 4
REPEAT 5:
REPEAT 6:
A = A + 5
A = A + 7
A = A + 8
A = A + 9
該片段中從 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循環兩次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循環中。
A = A + 5 實際總共的循環次數是 2 × 5 × 6 = 60 次。
請問該程式執行完畢之後,A 的值是多少?
【答案送出】
這是一道結果填空題,你隻需要算出結果後送出即可。本題的結果為一個整數,在送出答案時隻填寫這個整數,填寫多餘的内容将無法得分。
prog.txt:内容太多。。。不展示了。。。
題目下載下傳:【連結:https://pan.baidu.com/s/1XgZWE-3sxD7lw0-dhMnPHg 提取碼:zjxs】
【答案】:403
package provincialGames_11_2020_1_C;
public class _04_REPEAT程式 {
public static void main(String[] args) {
int a = 0, count = 1;
for (int i = 1; i <= 2; i++) {
a = a + 4;
for (int j = 1; j <= 5; j++) {
for (int k = 1; k <= 6; k++) {
a = a + 5;
System.out.println("第" + count++ + "次循環:" + a);
}
a = a + 7;
}
a = a + 8;
}
a = a + 9;
System.out.println(a);
System.out.println(count);
}
}
六、試題 F: 分類計數
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:15 分
【問題描述】
輸入一個字元串,請輸出這個字元串包含多少個大寫字母,多少個小寫字母,多少個數字。
【輸入格式】
輸入一行包含一個字元串。
【輸出格式】
輸出三行,每行一個整數,分别表示大寫字母、小寫字母和數字的個數。
【樣例輸入】
1+a=Aab
【樣例輸出】
1 3 1
【評測用例規模與約定】
對于所有評測用例,字元串由可見字元組成,長度不超過 100。
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _06_分類計數 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
char[] temp = str.toCharArray();
int upper = 0, lower = 0, digit = 0;
for (int i = 0; i < temp.length; i++) {
if ('A' <= temp[i] && temp[i] <= 'Z') {
upper++;
} else if ('a' <= temp[i] && temp[i] <= 'z') {
lower++;
} else if ('0' <= temp[i] && temp[i] <= '9') {
digit++;
}
}
System.out.println(upper + " " + lower + " " + digit);
}
}
七、試題 G: 整除序列
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:15 分
【問題描述】
有一個序列,序列的第一個數是 n,後面的每個數是前一個數整除 2,請輸出這個序列中值為正數的項。
【輸入格式】
輸入一行包含一個整數 n。
【輸出格式】
輸出一行,包含多個整數,相鄰的整數之間用一個空格分隔,表示答案。
【樣例輸入】
20
【樣例輸出】
20 10 5 2 1
【評測用例規模與約定】
對于 80% 的評測用例,1 ≤ n ≤ 10^9。
對于所有評測用例,1 ≤ n ≤ 10^18。
解法一:ArrayList(80分)
package provincialGames_11_2020_1_C;
import java.util.ArrayList;
import java.util.Scanner;
public class _06_整除序列 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(n);
while (n / 2 > 0) {
list.add(n / 2);
n /= 2;
}
for (int i = 0; i < list.size(); i++) {
if (i < list.size() - 1) {
System.out.print(list.get(i) + " ");
} else {
System.out.print(list.get(i));
}
}
}
}
解法一:ArrayList改進
package provincialGames_11_2020_1_CC;
import java.util.ArrayList;
import java.util.Scanner;
public class _06_整除序列_改進 { // 注意逾時!!!
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Long.MAX_VALUE);
Scanner sc = new Scanner(System.in);
Long n = sc.nextLong();
ArrayList<Long> list = new ArrayList<Long>();
list.add(n);
while (n / 2 > 0) {
list.add(n / 2);
n /= 2;
}
for (int i = 0; i < list.size(); i++) {
if (i < list.size() - 1) {
System.out.print(list.get(i) + " ");
} else {
System.out.print(list.get(i));
}
}
}
}
解法二:快速位運算(80分)
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _06_整除序列2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
while (n != 0) {
System.out.print(n + " ");
n = n >> 1; // 等價于/2,位運算相對快一些
}
}
}
解法二:快速位運算改進
package provincialGames_11_2020_1_CC;
import java.util.Scanner;
public class _06_整除序列2_改進 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Long n = sc.nextLong();
sc.close();
while (n != 0) {
System.out.print(n + " ");
n = n >> 1; // 等價于/2,位運算相對快一些
}
}
}
八、試題 H: 走方格
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:20 分
【問題描述】
在平面上有一些二維的點陣。 這些點的編号就像二維數組的編号一樣,從上到下依次為第 1 至第 n 行,從左到右依次為第 1 至第 m 列,每一個點可以用行号和列号來表示。
現在有個人站在第 1 行第 1 列,要走到第 n 行第 m 列。隻能向右或者向下走。
注意,如果行号和列數都是偶數,不能走入這一格中。
問有多少種方案。
【輸入格式】
輸入一行包含兩個整數 n, m。
【輸出格式】
輸出一個整數,表示答案。
【樣例輸入】
3 4
【樣例輸出】
2
【樣例輸入】
6 6
【樣例輸出】
【評測用例規模與約定】
對于所有評測用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
解法一:dp
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _08_走方格 {
public static void main(String[] args) {
// 輸入矩陣的寬高
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
sc.close();
int[][] dp = new int[n][m];
dp[0][0] = 1;
// 這個規律是隻能往右下走,也就是隻能取左上的值
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 第一行一列無需處理
if (i == 0 && j == 0) {
continue;
}
// 隻要不是第一行就可以取上面的
if (i > 0) {
dp[i][j] += dp[i - 1][j];
}
// 隻要不是第一列就可以取左面的
if (j > 0) {
dp[i][j] += dp[i][j - 1];
}
// 如果是偶數行列不能取值,這裡是奇數,因為我的是從0開始,是以偶數的就變成了奇數
if ((i & 1) == 1 && (j & 1) == 1) {
dp[i][j] = 0;
}
}
}
System.out.println(dp[n - 1][m - 1]);
}
}
解法二
package provincialGames_11_2020_1_CC;
import java.util.Scanner;
public class _08_走方格2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] grid = new int[n][m];
for (int i = 0; i < n; i++) {
grid[i][0] = 1;
}
for (int i = 0; i < m; i++) {
grid[0][i] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (i % 2 == 1 && j % 2 == 1) {
continue;
}
grid[i][j] = grid[i - 1][j] + grid[i][j - 1];
}
}
System.out.println(grid[n - 1][m - 1]);
}
}
解法三
原文位址
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _08_走方格3 {
static int n, m, count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
f(1, 1);
System.out.println(count);
}
private static void f(int n1, int m1) {
if (n1 == n && m1 == m) {
count++;
return;
}
if (n1 > n || m1 > m)
return;
int[][] arr = { { 0, 1 }, { 1, 0 } };
for (int i = 0; i < 2; i++) {
int x1 = n1 + arr[i][0];
int y1 = m1 + arr[i][1];
if (x1 % 2 == 0 && y1 % 2 == 0)
continue;
f(x1, y1);
}
return;
}
}
解法四:dfs
原文位址
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _08_走方格4 {
static long[][] dp;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int m = scanner.nextInt();
dp = new long[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = -1;
}
}
long res = dfs(1, 1, n, m);
System.out.println(res);
}
}
private static long dfs(int x, int y, int n, int m) {
if (x <= 0 || x > n || y <= 0 || y > m || (x % 2 == 0 && y % 2 == 0)) {
return 0;
}
if (dp[x][y] != -1) {
return dp[x][y];
}
if (x == n && y == m) {
return 1;
}
dp[x][y] = dfs(x + 1, y, n, m) + dfs(x, y + 1, n, m);
return dp[x][y];
}
}
九、試題 I: 字元串編碼
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分
【問題描述】
小明發明了一種給由全大寫字母組成的字元串編碼的方法。對于每一個大寫字母,小明将它轉換成它在 26 個英文字母中序号,即 A → 1, B → 2, ... Z → 26。
這樣一個字元串就能被轉化成一個數字序列:
比如 ABCXYZ → 123242526。
現在給定一個轉換後的數字序列,小明想還原出原本的字元串。當然這樣的還原有可能存在多個符合條件的字元串。小明希望找出其中字典序最大的字元串。
【輸入格式】
一個數字序列。
【輸出格式】
一個隻包含大寫字母的字元串,代表答案。
【樣例輸入】
123242526
【樣例輸出】
LCXYZ
【評測用例規模與約定】
對于 20% 的評測用例,輸入的長度不超過 20。
對于所有評測用例,輸入的長度不超過 200000。
ASCII碼表
解法一(有誤!!!)
注意:此題解有誤!!!部分樣例不過關!!!請看題解二!!!
package provincialGames_11_2020_1_C;
public class _09_字元串編碼2 { // 123242526 -> LCXYZ 【部分樣例不過關!】
public static void main(String[] args) {
java.util.Scanner sc = new java.util.Scanner(System.in);
String s = sc.nextLine();
char c[] = s.toCharArray();
String b = "";
for (int i = 0; i < c.length - 1;) {
int temp = (c[i] - '0') * 10 + (c[i + 1] - '0');
if (temp <= 26) {
b += ((char) ((temp - 1) + 'A'));
c[i] = '0';
c[i + 1] = '0';
i += 2;
} else {
b += ((char) ((temp / 10 - 1) + 'A'));
i++;
}
}
if (c[c.length - 1] != '0') {
s += c[c.length - 1];
}
System.out.println(b);
}
}
/**
// c[c.length - 1]:字元數組的倒數第1個字元
// c[c.length - 2]:字元數組的倒數第2個字元
// c[c.length - 3]:字元數組的倒數第3個字元
public static void main(String[] args) {
java.util.Scanner sc = new java.util.Scanner(System.in);
String s = sc.nextLine();
char c[] = s.toCharArray();
String b = "";
for (int i = 0; i < c.length - 1;) { // 周遊字元數組(最後一個字元并未周遊,防止數組越界!)
int temp = (c[i] - '0') * 10 + (c[i + 1] - '0'); // 字元轉數字
if (temp <= 26) {
b += ((char) ((temp - 1) + 'A')); // 将數字轉化為對應的字元
i += 2;
// c[i] = '0';
// if (i != c.length - 2) { // 如果字元c[i+1]是字元數組的最後一個字元
// }
// c[i + 1] = '0';
} else {
b += ((char) ((temp / 10 - 1) + 'A')); // 将數字轉化為對應的字元
i++;
}
}
if (c.length >= 3) { // 符合此條件,則字元數組的最後一個字元一定需要轉化為字母
int temp23 = (c[c.length - 3] - '0') * 10 + (c[c.length - 2] - '0'); // 倒數第2、3個字元合并
int temp12 = (c[c.length - 2] - '0') * 10 + (c[c.length - 1] - '0'); // 倒數第1、2個字元合并
if (temp23 >= 26) {
b += ((char) ((temp23 - 1) + 'A')); // 将數字轉化為對應的字元
}
}
System.out.println(b);
}
*/
解法二
原文連結
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _09_字元串編碼 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
sc.close();
StringBuilder sb = new StringBuilder();
int len = s.length();
char[] num = s.toCharArray();
for (int i = 0; i < len; i++) {
// 1開頭
if (num[i] == '1') {
// 第i+2位是否為0,如果為0,目前位就不能和i+1位合并成一個字母
if (i < len - 2) {
// 不為0
if (num[i + 2] != '0') {
// System.out.println((num[i]-'0') * 10 + num[i + 1] + 'A' -1 -'0' );
sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
++i;
// 為0,目前位就不能和i+1位合并成一個字母,(如果合成字母,剩下一個0沒辦法轉換)
} else {
sb.append((char) (num[i] - '0' + 'A' - 1));
}
// i+2已超過盡頭
} else {
// 看i+1位是否存在
if (i < len - 1) {
sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
// 不存在,第i位為最後一位
} else {
sb.append((char) (num[i] - '0' + 'A' - 1));
}
break;
}
// 2開頭
} else if (num[i] == '2') {
// 看存不存在下一位
if (i < len - 1) {
// 看下一位是不是小于6,因為字母的大小不能超過26
if (num[i + 1] <= '6') {
// 看第i+2位是否存在
if (i < len - 2) {
// 看第i+2位是否=0
if (num[i + 2] != '0') {
sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
++i;
// 為0,目前位就不能和i+1位合并成一個字母,(如果合成字母,剩下一個0沒辦法轉換)
} else {
sb.append((char) (num[i] - '0' + 'A' - 1));
}
// 不存在的話,就直接添加就行
} else {
sb.append((char) ((num[i] - '0') * 10 + num[i + 1] + 'A' - 1 - '0'));
break;
}
// 如果大于6,證明不能和後一位合并
} else {
sb.append((char) (num[i] - '0' + 'A' - 1));
}
// 不存在下一位,這一位就直接放進去
} else {
sb.append((char) (num[i] - '0' + 'A' - 1));
}
// 如果大于2的話,就直接添加就行,字母沒有2以上開頭的
} else {
sb.append((char) (num[i] - '0' + 'A' - 1));
}
}
System.out.println(sb.toString());
}
public static char getUppLetter(int num) {
System.out.println((char) (num));
return (char) (num);
}
}
十、試題 J: 整數小拼接
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分
【問題描述】
給定一個長度為 n 的數組 A1, A2, · · · , An。你可以從中選出兩個數 Ai 和 Aj (i 不等于 j),然後将 Ai 和 Aj 一前一後拼成一個新的整數。例如 12 和 345 可以拼成 12345 或 34512 。注意交換 Ai 和 Aj 的順序總是被視為 2 種拼法,即便是 Ai = Aj 時。
請你計算有多少種拼法滿足拼出的整數小于等于 K。
【輸入格式】
第一行包含 2 個整數 n 和 K。
第二行包含 n 個整數 A1, A2, · · · , An。
【輸出格式】 一個整數代表答案。
【樣例輸入】
4 33
1 2 3 4
【樣例輸出】
8
【評測用例規模與約定】
對于 30% 的評測用例,1 ≤ N ≤ 1000, 1 ≤ K ≤ 10^8 , 1 ≤ Ai ≤ 10^4。
對于所有評測用例,1 ≤ N ≤ 100000,1 ≤ K ≤ 10^10,1 ≤ Ai ≤ 10^9。
注意逾時!!!
其他解法
package provincialGames_11_2020_1_C;
import java.util.Scanner;
public class _10_整數小拼接 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = sc.nextInt();
}
int answer = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
String temp = array[i] + "" + array[j];
Integer sum = Integer.valueOf(temp);
if (i != j && sum <= k) {
answer++;
}
}
}
System.out.println(answer);
}
}
小結
寫題的時候,一定要注意資料的上界與下界!尤其是:10^9、10^18這種上界!!!