主頁 > 軟體設計 > 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】

2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】

2020-11-02 04:16:39 軟體設計

  • 藍橋杯 Java B組 省賽真題詳解及小結匯總【2013年(第4屆)~2020年(第11屆)】

  • 說明:大部分題解思路及程式代碼 源自 藍橋杯 官網視頻(Java B組歷年真題決議) —— 鄭未老師,
  1. 2013年 第04屆 藍橋杯 Java B組 省賽真題詳解及小結
  2. 2014年 第05屆 藍橋杯 Java B組 省賽真題詳解及小結
  3. 2015年 第06屆 藍橋杯 Java B組 省賽真題詳解及小結
  4. 2016年 第07屆 藍橋杯 Java B組 省賽真題詳解及小結
  5. 2017年 第08屆 藍橋杯 Java B組 省賽真題詳解及小結
  6. 2018年 第09屆 藍橋杯 Java B組 省賽真題詳解及小結
  7. 2019年 第10屆 藍橋杯 Java B組 省賽真題詳解及小結
  8. 2020年 第11屆 藍橋杯 第1次模擬賽真題詳解及小結【Java版】(校內模擬)
  9. 2020年 第11屆 藍橋杯 第2次模擬賽真題詳解及小結【Java版】
  10. 2020年 第11屆 藍橋杯 C/C++ B組 省賽真題詳解及小結【第1場省賽 2020.07.05】【Java版】
  11. 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2020.07.05】
  12. 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】
  13. 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個字符組合,

原文鏈接 思路: 本題的大致思路是

  1. 將數碼管的七段進行全排列(用數字代表數碼管欄位,0代表a,1代表b,以此類推)然后將這7個數字的所有可能全部排列(從7個數字中取m(1<=m<=7)進行排列)列舉出來,
  2. 得到所有的取值情況,再判斷每種情況構成的圖是否連通,若連通,sum++
  3. 進行排列時需要注意,一定要保證每個排列必須是遞增或者遞減,這樣才能不重復,例如: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/ruanti/198971.html

標籤:其他

上一篇:兔兔 的 題解 —— 2020 CSP-J 多校賽 T4

下一篇:《雪盈王》,一本漫畫,一個游戲,一場夢……

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more