- 藍橋杯 Java B組 省賽真題詳解及小結匯總【2013年(第4屆)~2020年(第11屆)】
- 說明:大部分題解思路及程式代碼 源自 藍橋杯 官網視頻(Java B組歷年真題決議) —— 鄭未老師,
- 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.07.05】【Java版】
- 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2020.07.05】
- 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】
- 2020年 第11屆 藍橋杯 Java C組 省賽真題詳解及小結【第1場省賽 2020.07.05】
- 第11屆 藍橋杯-第1、2次模擬(軟體類)真題-(2020年3月、4月)-官方講解視頻
目 錄
一、試題 A: 門牌制作——答案:641
解法一:x % 10 == 2
解法二:雙重for回圈+字符陣列
二、試題 B: 尋找 2020——答案:16520
三、試題 C: 蛇形填數——答案:761
解法一:規律推公式 (n-1)(2n-1)+n
解法二:手工計算(寫滿兩頁A4演草紙)
解法三:第i行第i列的值為a = a + (i*4)
解法四:找規律
四、試題 D: 七段碼——答案:80
五、試題 E: 排序——jonmlkihgfedcba
六、試題 F: 成績分析
七、試題 G: 單詞分析
八、試題 H: 數字三角形
九、試題 I: 子串分值和
十、試題 J: 裝飾珠
小結
試題下載:【鏈接:https://pan.baidu.com/s/11bI8HRFmb_FitUMvC5NF6Q 提取碼:zjxs】
說明:本文參考了很多大佬的題解,
![]()
![]()
一、試題 A: 門牌制作——答案:641
本題總分:5 分
【問題描述】
小藍要為一條街的住戶制作門牌號,
這條街一共有 2020 位住戶,門牌號從 1 到 2020 編號,
小藍制作門牌的方法是先制作 0 到 9 這幾個數字字符,最后根據需要將字符粘貼到門牌上,例如門牌 1017 需要依次粘貼字符 1、0、1、7,即需要 1 個 字符 0,2 個字符 1,1 個字符 7,
請問要制作所有的 1 到 2020 號門牌,總共需要多少個字符 2?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
【答案】:624
解法一:x % 10 == 2
【決議】:從1~2020開始回圈,一直計算即可,
package provincialGames_11_2020_2_JavaB;
public class _01_A_門牌制作 {
public static void main(String[] args) {
int ans = 0;
for (int i = 1; i <= 2020; i++) {
int x = i;
while (x > 0) {
if (x % 10 == 2)
ans++;
x /= 10;
}
}
System.out.println(ans);
}
}
解法二:雙重for回圈+字符陣列
【決議】:從1~2020開始回圈,將數字轉為字符數字,逐個比較字符,
package provincialGames_11_2020_2_JavaB;
public class _01_A_門牌制作2 {
public static void main(String[] args) {
int ans = 0;
for (int i = 1; i <= 2020; i++) {
char strArray[] = (i + "").toCharArray();
for (int j = 0; j < strArray.length; j++) {
if (strArray[j] == '2') {
ans++;
}
}
}
System.out.println(ans);
}
}
二、試題 B: 尋找 2020——答案:16520
本題總分:5 分
【問題描述】
小藍有一個數字矩陣,里面只包含數字 0 和 2,小藍很喜歡 2020,他想找到這個數字矩陣中有多少個 2020 ,
小藍只關注三種構成 2020 的方式:
? 同一行里面連續四個字符從左到右構成 2020,
? 同一列里面連續四個字符從上到下構成 2020,
? 在一條從左上到右下的斜線上連續四個字符,從左上到右下構成 2020,
例如,對于下面的矩陣:
220000
000000
002202
000000
000022
002020
一共有 5 個 2020,其中 1 個是在同一行里的,1 個是在同一列里的,3 個是斜線上的,
小藍的矩陣比上面的矩陣要大,由于太大了,他只好將這個矩陣放在了一個檔案里面,在試題目錄下有一個檔案 2020.txt,里面給出了小藍的矩陣,
請幫助小藍確定在他的矩陣中有多少個 2020,
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
【決議】:定義二維矩陣,遍歷每個坐標,以每個坐標為起點分別向右向下向右下三個方向遍歷,
原文鏈接
打開 txt 檔案,滑鼠放到最后一行最后一列,可以知道,是一個300行300列的矩陣,然后直接暴力三次回圈,分別是從左到右,從上到下,從左上到右下方向,比賽的時候在這里耗時有點久,因為除錯的時候,發現我復制輸入這個矩陣后,控制臺輸出的矩陣只有260多行,一直以為哪里寫錯了,
![]()
package provincialGames_11_2020_2_JavaB;
import java.util.Scanner;
public class _02_B_尋找2020 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] num = new int[301][301];
for (int i = 1; i <= 300; i++) {
String str = sc.next();
for (int j = 1; j <= str.length(); j++) {
num[i][j] = str.charAt(j - 1) - '0';
}
}
int ans = 0;
for (int i = 1; i <= 300; i++) {
for (int j = 1; j <= 300; j++) {
if (i + 3 <= 300 && num[i][j] == 2 && num[i + 1][j] == 0 && num[i + 2][j] == 2 && num[i + 3][j] == 0)
ans++;
}
}
for (int i = 1; i <= 300; i++) {
for (int j = 1; j <= 300; j++) {
if (j + 3 <= 300 && num[i][j] == 2 && num[i][j + 1] == 0 && num[i][j + 2] == 2 && num[i][j + 3] == 0)
ans++;
}
}
for (int i = 1; i <= 300; i++) {
for (int j = 1; j <= 300; j++) {
if (i + 3 <= 300 && j + 3 <= 300 && num[i][j] == 2 && num[i + 1][j + 1] == 0 && num[i + 2][j + 2] == 2
&& num[i + 3][j + 3] == 0)
ans++;
}
}
System.out.println(ans);
}
}
三、試題 C: 蛇形填數——答案:761
本題總分:10 分
【問題描述】
如下圖所示,小明用從 1 開始的正整數“蛇形”填充無限大的矩陣,
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ... (1)
11 ...
...
容易看出矩陣第二行第二列中的數是 5,請你計算矩陣中第 20 行第 20 列的數是多少?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
【答案】:761
解法一:規律推公式 (n-1)(2n-1)+n
原文鏈接
【決議】:由 規律推公式 (n-1)*(2n-1)+n ,帶入n=20得結果,
![]()
- 第1行:(1 - 1) * (2 * 1 - 1) + 1 = 1
- 第2行:(1-1)*(2*1 - 1) + 1 = 1
- 第3行:(1-1)*(2*1 - 1) + 1 = 1
- ...
解法二:手工計算(寫滿兩頁A4演草紙)
【決議】:計算程序——從第1行第1列資料開始計算,一致計算到第20行20列,差不多寫滿了2頁A4紙...
考試的時候,監考員會給每個考生發一張空白A4紙,使用A4紙進行手工計算,演草紙不夠的話,A4紙列印的準考證背面也可以使用,
這種題,一看就是找規律的題,大致一看,題中規律顯然與斐波那契數列沒有關系,慌了...
藍橋杯就好考斐波那契、全排列,但是這次省賽貌似都沒考...
不管黑貓🐱、白貓🐱,抓住耗子🐀就是好貓,o(=?ェ?=)m
解法三:第i行第i列的值為a = a + (i*4)
原文鏈接
先說下我考試的思路吧,就是把整個矩陣想左轉45°,然后就可以發現是一個有規律的三角形,可以發現矩陣中第 i 行第 j 列的數在這個三角形中是第 i* 2-1 行 j* 2-1 列最中間的數,那么第20行第20列就在三角形中的第39行39列的中間,答案也就出來了,
再說下別人的做法,直接找規律,第一行第一列的值為1,第二行第二列的值為5,第三行第三列的值為13,第四行第四列的值為25,仔細觀察就可以發現第i行第i列的值為 a = a + (i*4),可能要多畫幾個矩陣,才能發現規律,
package provincialGames_11_2020_2_JavaB;
public class _03_C_蛇形填數 {
public static void main(String[] args) {
int n = 20;
System.out.println((n - 1) * (2 * n - 1) + n);
System.out.println("---------");
for (int i = 1; i <= 20; i++) {
System.out.println((i - 1) * (2 * i - 1) + i);
}
System.out.println("---------");
int a = 1;
for (int i = 0; i < 20; i++) {
a = a + (i * 4);
System.out.println(a);
}
}
}
解法四:找規律
原文鏈接
第一行第一列是1;
第二行第二列是前面兩條斜行(左上到右下或者右上到左下為一條斜行),再數兩個數,
第三行第三列是前面四條斜行,再數三個數,
依次類推,20行第20列是前面38條斜行,再數20個數,
38條斜行為:1+2+…+38,最后結果(1+2+…+38)+20 = (1+38)38/2 +20 = 3919+20 = 761
四、試題 D: 七段碼——答案:80
【問題描述】
小藍要用七段碼數碼管來表示一種特殊的文字,
上圖給出了七段碼數碼管的一個圖示,數碼管中一共有 7 段可以發光的二 極管,分別標記為 a, b, c, d, e, f, g,
小藍要選擇一部分二極管(至少要有一個)發光來表達字符,在設計字符 的表達時,要求所有發光的二極管是連成一片的,
例如:b 發光,其他二極管不發光可以用來表達一種字符,
例如:c 發光,其他二極管不發光可以用來表達一種字符,這種方案與上一行的方案可以用來表示不同的字符,盡管看上去比較相似,
例如:a, b, c, d, e 發光,f, g 不發光可以用來表達一種字符,
例如:b, f 發光,其他二極管不發光則不能用來表達一種字符,因為發光 的二極管沒有連成一片,
請問,小藍可以用七段碼數碼管表達多少種不同的字符?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分,
【答案】:80
【決議】:列舉127種字符組合,挨個查看是否聯通,DFS生成127個字符組合,
原文鏈接 思路: 本題的大致思路是
- 將數碼管的七段進行全排列(用數字代表數碼管欄位,0代表a,1代表b,以此類推)然后將這7個數字的所有可能全部排列(從7個數字中取m(1<=m<=7)進行排列)列舉出來,
- 得到所有的取值情況,再判斷每種情況構成的圖是否連通,若連通,sum++
- 進行排列時需要注意,一定要保證每個排列必須是遞增或者遞減,這樣才能不重復,例如:012,021,210等等,它們都表示數碼管中取出ABC這一種情況,
package provincialGames_11_2020_2_JavaB;
public class _04_D_七段碼 {
static boolean[][] M;// M是鄰接矩陣
static int[] a;// a代表排列組合的數字
static int sum = 0;// 最后結果
public static void main(String[] args) {
/*
* M是鄰接矩陣,根據數碼管影像可以得到 例如:a和b,a和f都可以連通,那么代表0和1,0和5連通
*/
M = new boolean[7][7];
M[0][1] = M[1][0] = M[0][5] = M[5][0] = true;
M[1][2] = M[2][1] = M[1][6] = M[6][1] = true;
M[2][3] = M[3][2] = M[2][6] = M[6][2] = true;
M[4][3] = M[3][4] = true;
M[4][5] = M[5][4] = M[4][6] = M[6][4] = true;
M[5][6] = M[6][5] = true;
a = new int[7];
for (int i = 0; i < a.length; i++) {
a[i] = i;
}
// 所有排列的可能,深搜
for (int n = 1; n <= 7; n++) {
dfs(0, n);
}
System.out.println(sum);
}
public static void dfs(int k, int n) {
if (k == n) {
// 如果只有一個數,那么這種情況下必然成立
if (n == 1) {
sum++;
return;
}
// 判斷,這種情況下的圖是否連通,用的是并查集方法
// 初始化
int[] pre = new int[n];
for (int i = 0; i < pre.length; i++) {
pre[i] = i;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
// 兩層for窮舉所有邊的情況
// 若i和j連通,j加入i
// i和j代表的是結點,所以并的時候就是jion(pre,
// i,j),但是i代表的結點好j代表的結點是否連通,則需要看a[i]]和[a[j]在鄰接矩陣M中是否為真
if (M[a[i]][a[j]]) {
jion(pre, i, j);
}
}
}
// 到最后,若所有結點都連通,則所有結點的跟結點應該都一樣,否則說明此情況下的圖不連通
boolean flag = true;
for (int i = 1; i < pre.length; i++) {
if (find(pre, 0) != find(pre, i)) {
flag = false;
break;
}
}
if (flag) {
sum++;
}
return;
}
// dfs,深搜
for (int i = k; i < a.length; i++) {
if (k == 0 || a[i] > a[k - 1]) {
int t = a[i];
a[i] = a[k];
a[k] = t;
dfs(k + 1, n);
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
// 查找根節點
public static int find(int[] pre, int node) {
int son = node, temp = 0;
// 查找根節點
while (node != pre[node]) {
node = pre[node];
}
// 路徑優化
while (son != node) {
temp = pre[son];
// 直接通跟
pre[son] = node;
// son向上走一格
son = pre[son];
}
return node;
}
// 兩個結點相并
public static void jion(int[] pre, int x, int y) {
int fx = find(pre, x);
int fy = find(pre, y);
// 兩個結點屬于不同圖,相并
if (fx != fy) {
pre[fy] = fx;
}
}
}
五、試題 E: 排序——jonmlkihgfedcba
本題總分:15 分
【問題描述】
小藍最近學習了一些排序演算法,其中冒泡排序讓他印象深刻,
在冒泡排序中,每次只能交換相鄰的兩個元素,
小藍發現,如果對一個字串中的字符排序,只允許交換相鄰的兩個字符,則在所有可能的排序方案中,冒泡排序的總交換次數是最少的,
例如,對于字串 lan 排序,只需要 1 次交換,對于字串 qiao 排序,總共需要 4 次交換,
小藍找到了很多字串試圖排序,他恰巧碰到一個字串,需要 100 次交換,可是他忘了吧這個字串記下來,現在找不到了,
請幫助小藍找一個只包含小寫英文字母且沒有字母重復出現的字串,對該串的字符排序,正好需要 100 次交換,如果可能找到多個,請告訴小藍最短的那個,如果最短的仍然有多個,請告訴小藍字典序最小的那個,請注意字串中可以包含相同的字符,
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可,本題的結果為一個只包含小寫英文字母的字串,在提交答案時只填寫這個字串,填寫多余的內容將無法得分,
【答案】:jonmlkihgfedcba
【決議】:冒泡排序,要求字串最短,那就假設完全逆序,設長度為n,則移動次數為 n*(n-1)/2,要求移動次數恰好大于100,則 n=15;移動次數105,要求字典序最小,則把第六個字符移動到第一個位置,前五個字符后移一位,純邏輯推導,無代碼,
原文鏈接
思路: 首先要注意最后得到的字串全是英文小寫字母并且不重復,接下來進行分析,最后要求結果在最短的前提下字典序最小,那么我們先想辦法找到最短的結果,
??最短,那是能多短就多短,最短是長度是1,但是肯定不可能,因為他還要求字串進行了100次交換,那么長度為2可不可以呢?也不行,長度為2的字串最多進行一次交換,
??一個長度為n的字串,如果進行冒泡排序,假設他每次比較都進行了交換,那么它最多交換 (n-1)+(n-2)+…+1 = n*(n-1)/2 (進行n-1趟操作,第一趟操作交換n-1次,之后每趟交換的次數依次遞減),
??在n*(n-1)/2>=100的前提下,n的最小值是15,也就是說,最后結果的字串的長度至少15(低于15,它根本連交換100次的要求都達不到),接下來再和題目要求的字典序最小一起考慮,
??首先了解一下字典序:字典序是指從前到后比較兩個字串的大小的方法,首先比較第一個字符,如果不同則第一個字符較小的字串更小,如果相同則繼續比較第2個字符…如此繼續,來比較整個字串的大小,
??現在我們知道字串全是英文小寫字母,并且長度為15且各不相同,那么我們可以確定這15個字母就是前15個小寫英文字母abcdefghijklklmno,怎么排現在還不知道,
??用逆向思維思考,若這15個字母每次冒泡兩兩比較都進行交換,能交換 15*(15-1) = 105次,那這個字串只可能是這15個字母的逆序:onmlkjighfedecba,
??然后我們再想辦法減少逆序字串的5次比較,并且使最后得到的結果字典序最小,只需要把逆序字串的第六位提前至第一位:jonmlkighfedecba,在這種情況下,字典序就是最小的,我只需要第一位比你小,我就是字典序最小的,而且第1,2,3,4,5趟,每次j會分別和o,n,m,k,l進行比較,但是不交換,這樣就省下了5次交換,且最后一共交換105-5=100次,
六、試題 F: 成績分析
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:15 分
【問題描述】
小藍給學生們組織了一場考試,卷面總分為 100 分,每個學生的得分都是一個 0 到 100 的整數,
請計算這次考試的最高分、最低分和平均分,
【輸入格式】
輸入的第一行包含一個整數 n,表示考試人數,
接下來 n 行,每行包含一個 0 至 100 的整數,表示一個學生的得分,
【輸出格式】
輸出三行,
第一行包含一個整數,表示最高分,
第二行包含一個整數,表示最低分,
第三行包含一個實數,四舍五入保留正好兩位小數,表示平均分,
【樣例輸入】
7
80
92
56
74
88
99
10
【樣例輸出】
99
10
71.29
【評測用例規模與約定】
對于 50% 的評測用例,1 ≤ n ≤ 100,
對于所有評測用例,1 ≤ n ≤ 10000,
【決議】:String.format("%.2f", xxx):自動四舍五入
package provincialGames_11_2020_2_JavaB;
import java.util.Scanner;
public class _06_F_成績分析 { // String.format("%.2f", xxx):自動四舍五入
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
double sum = 0;
for (int i = 0; i < n; i++) {
int t = sc.nextInt();
min = Math.min(min, t);
max = Math.max(max, t);
sum += t;
}
System.out.println(max + "\n" + min + "\n" + String.format("%.2f", sum / n));
}
}
七、試題 G: 單詞分析
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:20 分
【問題描述】
小藍正在學習一門神奇的語言,這門語言中的單詞都是由小寫英文字母組成,有些單詞很長,遠遠超過正常英文單詞的長度,小藍學了很長時間也記不住一些單詞,他準備不再完全記憶這些單詞,而是根據單詞中哪個字母出現得最多來分辨單詞,
現在,請你幫助小藍,給了一個單詞后,幫助他找到出現最多的字母和這個字母出現的次數,
【輸入格式】
輸入一行包含一個單詞,單詞只由小寫英文字母組成,
【輸出格式】
輸出兩行,第一行包含一個英文字母,表示單詞中出現得最多的字母是哪個,如果有多個字母出現的次數相等,輸出字典序最小的那個,
第二行包含一個整數,表示出現得最多的那個字母在單詞中出現的次數,
【樣例輸入】
lanqiao
【樣例輸出】
a
2
【樣例輸入】
longlonglongistoolong
【樣例輸出】
o
6
【評測用例規模與約定】
對于所有的評測用例,輸入的單詞長度不超過 1000,
【決議】:記錄每個字符的出現次數即可,
package provincialGames_11_2020_2_JavaB;
import java.util.Scanner;
public class _07_G_單詞分析 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char charArray[] = sc.next().toCharArray(); // 字符陣列
int nums[] = new int[26]; // int型陣列 記錄 每個字母的出現次數
for (int i = 0; i < charArray.length; i++) {
nums[charArray[i] - 'a']++;
}
int ans = nums[0], index = 0;
for (int i = 0; i < 26; i++) {
if (nums[i] > ans) {
ans = nums[i];
index = i;
}
}
System.out.println((char) ('a' + index) + "\n" + ans);
}
}
八、試題 H: 數字三角形
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:20 分
【問題描述】
上圖給出了一個數字三角形,從三角形的頂部到底部有很多條不同的路徑,對于每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和,
路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數,此外,向左下走的次數與向右下走的次數相差不能超過 1,
【輸入格式】
輸入的第一行包含一個整數 N (1 < N ≤ 100),表示三角形的行數,下面的 N 行給出數字三角形,數字三角形上的數都是 0 至 100 之間的整數,
【輸出格式】
輸出一個整數,表示答案,
【樣例輸入】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【樣例輸出】
27
【決議】:dp推導+奇偶判斷
package provincialGames_11_2020_2_JavaB;
import java.util.Scanner;
public class _08_H_數字三角形 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int arr[][] = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
arr[i][j] = sc.nextInt();
arr[i][j] += Math.max(arr[i - 1][j - 1], arr[i - 1][j]);
}
}
System.out.println(n % 2 == 1 ? arr[n][n / 2 + 1] : Math.max(arr[n][n / 2], arr[n][n / 2 + 1]));
}
}
九、試題 I: 子串分值和
試題 I: 子串分值和 時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分
【問題描述】
對于一個字串 S,我們定義 S 的分值 f(S ) 為 S 中出現的不同的字符個數,例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1,
現在給定一個字串 S [0..n ? 1](長度為 n),請你計算對于所有 S 的非空子串 S [i.. j](0 ≤ i ≤ j < n),f(S [i.. j]) 的和是多少,
【輸入格式】
輸入一行包含一個由小寫字母組成的字串 S,
【輸出格式】
輸出一個整數表示答案,
【樣例輸入】
ababc
【樣例輸出】
28
【樣例說明】
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
【評測用例規模與約定】
對于 20% 的評測用例,1 ≤ n ≤ 10;
對于 40% 的評測用例,1 ≤ n ≤ 100;
對于 50% 的評測用例,1 ≤ n ≤ 1000;
對于 60% 的評測用例,1 ≤ n ≤ 10000;
對于所有評測用例,1 ≤ n ≤ 100000,
【決議】:寫了個兩層暴力,for回圈,時間復雜度n^2,HashSet去重,
package provincialGames_11_2020_2_JavaB;
import java.util.HashSet;
import java.util.Scanner;
public class _09_I_字串分值和 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String string = sc.next();
char c[] = string.toCharArray();
long ans = 0;
for (int i = 0; i < c.length; i++) {
HashSet<Character> set = new HashSet<Character>(); // HashSet去重
for (int j = i; j < c.length; j++) {
set.add(c[j]);
ans += set.size();
}
}
System.out.println(ans);
}
}
十、試題 J: 裝飾珠
時間限制: 1.0s 記憶體限制: 512.0MB 本題總分:25 分
【問題描述】
在怪物獵人這一款游戲中,玩家可以通過給裝備鑲嵌不同的裝飾珠來獲取相應的技能,以提升自己的戰斗能力,
已知獵人身上一共有 6 件裝備,每件裝備可能有若干個裝飾孔,每個裝飾孔有各自的等級,可以鑲嵌一顆小于等于自身等級的裝飾珠 (也可以選擇不鑲嵌),
裝飾珠有 M 種,編號 1 至 M,分別對應 M 種技能,第 i 種裝飾珠的等級為 Li,只能鑲嵌在等級大于等于 Li 的裝飾孔中,
對第 i 種技能來說,當裝備相應技能的裝飾珠數量達到 Ki 個時,會產生 Wi(Ki) 的價值,鑲嵌同類技能的數量越多,產生的價值越大,即 Wi(Ki ? 1) < Wi(Ki),但每個技能都有上限 Pi(1 ≤ Pi ≤ 7),當裝備的珠子數量超過 Pi 時,只會產生 Wi(Pi) 的價值,
對于給定的裝備和裝飾珠資料,求解如何鑲嵌裝飾珠,使得 6 件裝備能得到的總價值達到最大,
【輸入格式】
輸入的第 1 至 6 行,包含 6 件裝備的描述,其中第 i 的第一個整數 Ni 表示第 i 件裝備的裝飾孔數量,后面緊接著 Ni 個整數,分別表示該裝備上每個裝飾 孔的等級 L(1 ≤ L ≤ 4),
第 7 行包含一個正整數 M,表示裝飾珠 (技能) 種類數量,
第 8 至 M + 7 行,每行描述一種裝飾珠 (技能) 的情況,每行的前兩個整數 Lj(1 ≤ Lj ≤ 4) 和 Pj(1 ≤ Pi ≤ 7) 分別表示第 j 種裝飾珠的等級和上限,接下來 Pj 個整數,其中第 k 個數表示裝備該中裝飾珠數量為 k 時的價值 Wj(k),
【輸出格式】
輸出一行包含一個整數,表示能夠得到的最大價值,
【樣例輸入】
1 1
2 1 2
1 1
2 2 2
1 1
1 3
3
1 5 1 2 3 5 8
2 4 2 4 8 15
3 2 5 10
【樣例輸出】
20
【樣例說明】
按照如下方式鑲嵌珠子得到最大價值 18,括號內表示鑲嵌的裝飾珠的種類編號:
1: (1)
2: (1)(2)
3: (1)
4: (2) (2)
5: (1)
6: (2)
4 顆技能 1 裝飾珠,4 顆技能 2 裝飾珠 W1(4) + W2(4) = 5 + 15 = 20,
【評測用例規模與約定】
暫無
小結
河南省賽區:一等獎得獎情況示例(75分):
- 一、試題 A: 門牌制作——本題總分:5 分
- 三、試題 C: 蛇形填數——本題總分:10 分
- 六、試題 F: 成績分析——本題總分:15 分
- 七、試題 G: 單詞分析——本題總分:20 分
- 九、試題 I: 子串分值和——本題總分:25 分
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198801.html
標籤:其他















