日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

2016年 第7届 蓝桥杯 Java B组 省赛解析及总结

發布時間:2024/9/30 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2016年 第7届 蓝桥杯 Java B组 省赛解析及总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 藍橋杯 Java B組 省賽決賽 真題詳解及小結匯總【2013年(第4屆)~2021年(第12屆)】
  • 第11屆 藍橋杯-第1、2次模擬(軟件類)真題-(2020年3月、4月)-官方講解視頻

  • 說明:部分題解思路及程序代碼 源自?藍橋杯 官網視頻(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 C組 省賽真題詳解及小結【第1場省賽 2020.07.05】
  • 2020年 第11屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2020.10.17】
  • 2021年 第12屆 藍橋杯 第1次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 第2次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 第3次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯 第4次模擬賽真題詳解及小結【Java版】
  • 2021年 第12屆 藍橋杯【備賽 直播 公開課 —— 軟件類(本科組、高職高專組)】
  • 2021年 第12屆 藍橋杯 Java B組 省賽真題詳解及小結【第1場省賽 2021.04.18】
  • 2021年 第12屆 藍橋杯 Java B組 省賽真題詳解及小結【第2場省賽 2021.05.09】

  • 2015年 第06屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2016年 第07屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2017年 第08屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2018年 第09屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2019年 第10屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 2020年 第11屆 藍橋杯 Java B組 決賽真題詳解及小結
  • 目? ?錄

    一、煤球數目

    二、生日蠟燭

    三、湊算式

    全排列---無重復元素---遞歸模板

    四、分小組

    五、抽簽

    六、方格填數

    解法一

    解法二

    七、剪郵票

    八、四平方和

    Map小練習

    九、取球博弈

    十、壓縮變換

    30分

    100分

    小結


    ? ??

    一、煤球數目

    煤球數目

    有一堆煤球,堆成三角棱錐形。具體:
    第一層放1個,
    第二層3個(排列成三角形),
    第三層6個(排列成三角形),
    第四層10個(排列成三角形),
    ....
    如果一共有100層,共有多少個煤球?

    請填表示煤球總數目的數字。
    注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

    【答案】:171700

    ?

    package provincialGames_07_2016_JavaB;public class A01_煤球數目 {public static void main(String[] args) { // 171700int pre = 1;int plus = 2;long sum = 1;for (int k = 2; k <= 100; k++) {sum += (pre + plus); // 前一層的值pre += plus;plus++;}System.out.println(sum);} }

    二、生日蠟燭

    生日蠟燭

    某君從某年開始每年都舉辦一次生日party,并且每次都要吹熄與年齡相同根數的蠟燭。

    現在算起來,他一共吹熄了236根蠟燭。

    請問,他從多少歲開始過生日party的?

    請填寫他開始過生日party的年齡數。
    注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

    【答案】:26

    package provincialGames_07_2016_JavaB;public class A02_生日蠟燭 {public static void main(String[] args) { // 26// 1、枚舉兩個年齡[i, j]for (int i = 1; i < 100; i++) {for (int j = i; j < 100; j++) {if ((i + j) * (j - i + 1) / 2 == 236) // 后除2, 避免奇數System.out.println("1: " + i + " " + j);}}System.out.println("------");// 2、枚舉生日舉辦次數[(236 - t) / i, (236 - t) / i + i]for (int i = 1; i < 100; i++) {int t = i * (i - 1) / 2;if ((236 - t) % i == 0)System.out.println("2: " + (236 - t) / i + " " + i);}} }

    三、湊算式

    湊算式

    ? ? ?B ? ? ?DEF
    A + --- + ------- = 10
    ? ? ?C ? ? ?GHI
    ? ? ?
    (如果顯示有問題,可以參見【圖1.jpg】)

    圖1.jpg


    這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。

    比如:
    6+8/3+952/714 就是一種解法,
    5+3/1+972/486 是另一種解法。

    這個算式一共有多少種解法?

    注意:你提交應該是個整數,不要填寫任何多余的內容或說明性文字。

    【答案】:29

    全排列---無重復元素---遞歸模板

    package provincialGames_07_2016_JavaB;public class A03_湊算式 { // 29static int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };static int ans;static boolean check() {int x = a[3] * 100 + a[4] * 10 + a[5]; // DEFint y = a[6] * 100 + a[7] * 10 + a[8]; // GHIif ((a[1] * y + a[2] * x) % (a[2] * y) == 0 && a[0] + (a[1] * y + a[2] * x) / (a[2] * y) == 10)return true;return false;}// 遞歸回溯生成全排列,適用于無重復元素的情況 考慮第k位,前面已經排定static void f(int k) {if (k == 9) { // 一種排列已經生成if (check())ans++;}// 從k往后的每個數字都可以放在k位for (int i = k; i < 9; ++i) {{int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1); // 遞歸{ // 回溯int t = a[i];a[i] = a[k];a[k] = t;}}}public static void main(String[] args) {f(0);System.out.println(ans);} }

    四、分小組

    分小組

    9名運動員參加比賽,需要分3組進行預賽。
    有哪些分組的方案呢?

    我們標記運動員為 A,B,C,... I
    下面的程序列出了所有的分組方法。

    該程序的正常輸出為:
    ABC DEF GHI
    ABC DEG FHI
    ABC DEH FGI
    ABC DEI FGH
    ABC DFG EHI
    ABC DFH EGI
    ABC DFI EGH
    ABC DGH EFI
    ABC DGI EFH
    ABC DHI EFG
    ABC EFG DHI
    ABC EFH DGI
    ABC EFI DGH
    ABC EGH DFI
    ABC EGI DFH
    ABC EHI DFG
    ABC FGH DEI
    ABC FGI DEH
    ABC FHI DEG
    ABC GHI DEF
    ABD CEF GHI
    ABD CEG FHI
    ABD CEH FGI
    ABD CEI FGH
    ABD CFG EHI
    ABD CFH EGI
    ABD CFI EGH
    ABD CGH EFI
    ABD CGI EFH
    ABD CHI EFG
    ABD EFG CHI
    ..... (以下省略,總共560行)。

    public class A
    {
    ?? ?public static String remain(int[] a)
    ?? ?{
    ?? ??? ?String s = "";
    ?? ??? ?for(int i=0; i<a.length; i++){
    ?? ??? ??? ?if(a[i] == 0) s += (char)(i+'A');
    ?? ??? ?}?? ?
    ?? ??? ?return s;
    ?? ?}
    ?? ?
    ?? ?public static void f(String s, int[] a)
    ?? ?{
    ?? ??? ?for(int i=0; i<a.length; i++){
    ?? ??? ??? ?if(a[i]==1) continue;
    ?? ??? ??? ?a[i] = 1;
    ?? ??? ??? ?for(int j=i+1; j<a.length; j++){
    ?? ??? ??? ??? ?if(a[j]==1) continue;
    ?? ??? ??? ??? ?a[j]=1;
    ?? ??? ??? ??? ?for(int k=j+1; k<a.length; k++){
    ?? ??? ??? ??? ??? ?if(a[k]==1) continue;
    ?? ??? ??? ??? ??? ?a[k]=1;
    ?? ??? ??? ??? ??? ?System.out.println(__________________________________); ?//填空位置
    ?? ??? ??? ??? ??? ?a[k]=0;
    ?? ??? ??? ??? ?}
    ?? ??? ??? ??? ?a[j]=0;
    ?? ??? ??? ?}
    ?? ??? ??? ?a[i] = 0;
    ?? ??? ?}
    ?? ?}
    ?? ?
    ?? ?public static void main(String[] args)
    ?? ?{
    ?? ??? ?int[] a = new int[9];?? ??? ?
    ?? ??? ?a[0] = 1;
    ?? ??? ?
    ?? ??? ?for(int b=1; b<a.length; b++){
    ?? ??? ??? ?a[b] = 1;
    ?? ??? ??? ?for(int c=b+1; c<a.length; c++){
    ?? ??? ??? ??? ?a[c] = 1;
    ?? ??? ??? ??? ?String s = "A" + (char)(b+'A') + (char)(c+'A');
    ?? ??? ??? ??? ?f(s,a);
    ?? ??? ??? ??? ?a[c] = 0;
    ?? ??? ??? ?}
    ?? ??? ??? ?a[b] = 0;
    ?? ??? ?}
    ?? ?}
    }

    仔細閱讀代碼,填寫劃線部分缺少的內容。

    注意:不要填寫任何已有內容或說明性文字。

    【答案】:s + (char) (i + 'A') + (char) (j + 'A') + (char) (k + 'A') + remain(a)

    9名隊員分三組? ? ??注重邏輯? ? ? ?根據題中所未使用的變量進行填空 [ 參考已有代碼形式?];題中所給變量,一般必定會被使用。

    • for (0——a.length)
    • ? ? ? for (...)
    • ? ? ? ? ? ?for (...)
    package provincialGames_07_2016_JavaB;public class A04_分小組 {public static String remain(int[] a) {String s = "";for (int i = 0; i < a.length; i++) {if (a[i] == 0)s += (char) (i + 'A');}return s;}static int cnt;public static void f(String s, int[] a) {for (int i = 0; i < a.length; i++) {if (a[i] == 1)continue;a[i] = 1;for (int j = i + 1; j < a.length; j++) {if (a[j] == 1)continue;a[j] = 1;for (int k = j + 1; k < a.length; k++) {if (a[k] == 1)continue;a[k] = 1;// System.out.println(____________); //填空位置System.out.println(s + (char) (i + 'A') + (char) (j + 'A') + (char) (k + 'A') + remain(a));cnt++;a[k] = 0;}a[j] = 0;}a[i] = 0;}}public static void main(String[] args) {int[] a = new int[9];a[0] = 1;for (int b = 1; b < a.length; b++) {a[b] = 1;for (int c = b + 1; c < a.length; c++) {a[c] = 1;String s = "A" + (char) (b + 'A') + (char) (c + 'A');f(s, a);a[c] = 0;}a[b] = 0;}System.out.println(cnt);} }

    五、抽簽

    抽簽

    X星球要派出一個5人組成的觀察團前往W星。
    其中:
    A國最多可以派出4人。
    B國最多可以派出2人。
    C國最多可以派出2人。
    ....

    那么最終派往W星的觀察團會有多少種國別的不同組合呢?

    下面的程序解決了這個問題。
    數組a[] 中既是每個國家可以派出的最多的名額。
    程序執行結果為:
    DEFFF
    CEFFF
    CDFFF
    CDEFF
    CCFFF
    CCEFF
    CCDFF
    CCDEF
    BEFFF
    BDFFF
    BDEFF
    BCFFF
    BCEFF
    BCDFF
    BCDEF
    ....
    (以下省略,總共101行)


    public class A
    {
    ?? ?public static void f(int[] a, int k, int n, String s)
    ?? ?{
    ?? ??? ?if(k==a.length){?
    ?? ??? ??? ?if(n==0) System.out.println(s);
    ?? ??? ??? ?return;
    ?? ??? ?}
    ?? ??? ?
    ?? ??? ?String s2 = s;
    ?? ??? ?for(int i=0; i<=a[k]; i++){
    ?? ??? ??? ?_____________________________; ? //填空位置
    ?? ??? ??? ?s2 += (char)(k+'A');
    ?? ??? ?}
    ?? ?}
    ?? ?
    ?? ?public static void main(String[] args)
    ?? ?{
    ?? ??? ?int[] a = {4,2,2,1,1,3};
    ?? ??? ?
    ?? ??? ?f(a,0,5,"");
    ?? ?}
    }


    仔細閱讀代碼,填寫劃線部分缺少的內容。

    注意:不要填寫任何已有內容或說明性文字。

    【答案】:f(a, k + 1, n - i, s2)

    搞清楚遞歸參數含義、變化方向。

    package provincialGames_07_2016_JavaB;public class A05_抽簽 {private static int ans;public static void f(int[] a, int k, int n, String s) {if (k == a.length) {if (n == 0) {ans++;System.out.println(s);}return;}String s2 = s;for (int i = 0; i <= a[k]; i++) {f(a, k + 1, n - i, s2); // 填空位置s2 += (char) (k + 'A');}}public static void main(String[] args) {int[] a = { 4, 2, 2, 1, 1, 3 };f(a, 0, 5, "");System.out.println(ans);} }

    六、方格填數

    方格填數

    如下的10個格子
    ? ?+--+--+--+
    ? ?| ?| ?| ?|
    +--+--+--+--+
    | ?| ?| ?| ?|
    +--+--+--+--+
    | ?| ?| ?|
    +--+--+--+

    (如果顯示有問題,也可以參看【圖1.jpg】)

    圖1.jpg

    填入0~9的數字。要求:連續的兩個數字不能相鄰。
    (左右、上下、對角都算相鄰)

    一共有多少種可能的填數方案?

    請填寫表示方案數目的整數。
    注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

    【答案】:1580

    ????

    解法一

    package provincialGames_07_2016_JavaB;import static java.lang.Math.*;public class A06_方格填數1 { // 1580static int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };static int ans;static boolean check() {if (abs(a[0] - a[1]) == 1 || abs(a[0] - a[3]) == 1 || abs(a[0] - a[4]) == 1 || abs(a[0] - a[5]) == 1 ||abs(a[1] - a[2]) == 1 || abs(a[1] - a[4]) == 1 || abs(a[1] - a[5]) == 1 || abs(a[1] - a[6]) == 1 ||abs(a[2] - a[5]) == 1 || abs(a[2] - a[6]) == 1 ||abs(a[3] - a[4]) == 1 || abs(a[3] - a[7]) == 1 || abs(a[3] - a[8]) == 1 ||abs(a[4] - a[5]) == 1 || abs(a[4] - a[7]) == 1 || abs(a[4] - a[8]) == 1 || abs(a[4] - a[9]) == 1 ||abs(a[5] - a[6]) == 1 || abs(a[5] - a[8]) == 1 || abs(a[5] - a[9]) == 1 ||abs(a[6] - a[9]) == 1 ||abs(a[7] - a[8]) == 1 ||abs(a[8] - a[9]) == 1)return false;return true;}// 考慮第k個位置,一般從0開始static void f(int k) {if (k == 10) { // 出口boolean b = check();if (b)ans++;return;}for (int i = k; i < 10; ++i) {{ // 嘗試將位置i與位置k交換,以此確定k位的值int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1);{ // 回溯int t = a[i];a[i] = a[k];a[k] = t;}}}public static void main(String[] args) {f(0);System.out.println(ans);} }

    解法二

    package provincialGames_07_2016_JavaB;public class A06_方格填數2 { // 1580static int a[][] = new int[5][6];static int vis[] = new int[10];static int ans;static boolean check(int i, int j) {for (int x = i - 1; x <= i + 1; ++x) {for (int y = j - 1; y <= j + 1; ++y) {if (Math.abs(a[x][y] - a[i][j]) == 1)return false;}}return true;}static void f(int x, int y) {if (x == 3 && y == 4) {ans++;return;}// 從0~9中抓一個for (int i = 0; i < 10; ++i) {if (vis[i] == 0) { // i沒有被用過a[x][y] = i; // 填數if (!check(x, y)) { // 不合法,恢復并continuea[x][y] = -10;continue;}vis[i] = 1; // 標記為已訪問if (y == 4)f(x + 1, 1); // 換行elsef(x, y + 1); // 繼續填右側的格子{vis[i] = 0; // 回溯a[x][y] = -10;}}}}static void init() {for (int i = 0; i < 5; ++i) {for (int j = 0; j < 6; ++j) {a[i][j] = -10;}}}// 3×4 -> 5×6public static void main(String[] args) {init();f(1, 2);System.out.println(ans);} }

    七、剪郵票

    剪郵票

    如【圖1.jpg】, 有12張連在一起的12生肖的郵票。
    現在你要從中剪下5張來,要求必須是連著的。
    (僅僅連接一個角不算相連)
    比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。

    請你計算,一共有多少種不同的剪取方法。

    請填寫表示方案數目的整數。
    注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

    ? ?? ??

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1.jpg? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.jpg? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3.jpg

    【答案】:116

    package provincialGames_07_2016_JavaB;public class A07_剪郵票 { // 116static int a[] = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 }; // 它的每個排列代表著12選5的一個方案static int ans;static void dfs(int g[][], int i, int j) {g[i][j] = 0;if (i - 1 >= 0 && g[i - 1][j] == 1)dfs(g, i - 1, j);if (i + 1 <= 2 && g[i + 1][j] == 1)dfs(g, i + 1, j);if (j - 1 >= 0 && g[i][j - 1] == 1)dfs(g, i, j - 1);if (j + 1 <= 3 && g[i][j + 1] == 1)dfs(g, i, j + 1);}static boolean check(int path[]) {int g[][] = new int[3][4];// 將某個排列映射到二維矩陣上for (int i = 0; i < 3; ++i) {for (int j = 0; j < 4; ++j) {if (path[i * 4 + j] == 1) // 二維數組轉一維數組g[i][j] = 1;elseg[i][j] = 0;}}int cnt = 0; // 連通塊的數目// g上面就有5個格子被標記為1,現在才用dfs做連通性檢查,要求只有一個連通塊for (int i = 0; i < 3; ++i) {for (int j = 0; j < 4; ++j) {if (g[i][j] == 1) {dfs(g, i, j);cnt++;}}}return cnt == 1;}static boolean vis[] = new boolean[12];static void f(int k, int path[]) {if (k == 12) {if (check(path)) {ans++;}}for (int i = 0; i < 12; ++i) {if (i > 0 && a[i] == a[i - 1] && !vis[i - 1])continue; // 現在準備選取的元素和上一個元素相同,但是上一個元素還沒被使用if (!vis[i]) { // 沒有被用過的元素可以抓入到pathvis[i] = true; // 標記為已訪問path[k] = a[i]; // 將a[i]填入到path[k]中f(k + 1, path); // 遞歸vis[i] = false; // 回溯}}}public static void main(String[] args) {int path[] = new int[12];f(0, path);System.out.println(ans);} }

    八、四平方和

    四平方和

    四平方和定理,又稱為拉格朗日定理:
    每個正整數都可以表示為至多4個正整數的平方和。
    如果把0包括進去,就正好可以表示為4個數的平方和。

    比如:
    5 = 0^2 + 0^2 + 1^2 + 2^2
    7 = 1^2 + 1^2 + 1^2 + 2^2
    (^符號表示乘方的意思)

    對于一個給定的正整數,可能存在多種平方和的表示法。
    要求你對4個數排序:
    0 <= a <= b <= c <= d
    并對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最后輸出第一個表示法


    程序輸入為一個正整數N (N<5000000)
    要求輸出4個非負整數,按從小到大排序,中間用空格分開

    例如,輸入:
    5
    則程序應該輸出:
    0 0 1 2

    再例如,輸入:
    12
    則程序應該輸出:
    0 2 2 2

    再例如,輸入:
    773535
    則程序應該輸出:
    1 1 267 838

    資源約定:
    峰值內存消耗(含虛擬機) < 256M
    CPU消耗 ?< 3000ms


    請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

    所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
    注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
    注意:主類的名字必須是:Main,否則按無效代碼處理。

    package provincialGames_07_2016_JavaB;import java.util.HashMap; import java.util.Map; import java.util.Scanner;import static java.lang.Math.sqrt;public class A08_四平方和 {static int N;static Map<Integer, Integer> cache = new HashMap<Integer, Integer>();public static void main(String[] args) {Scanner sc = new Scanner(System.in);N = sc.nextInt();for (int c = 0; c * c <= N / 2; ++c) { // 緩存for (int d = c; c * c + d * d <= N; ++d) {if (cache.get(c * c + d * d) == null) // 如果c^2 + d^2為空cache.put(c * c + d * d, c); // 存儲c^2 + d^2}}for (int a = 0; a * a <= N / 4; ++a) {for (int b = a; a * a + b * b <= N / 2; ++b) {if (cache.get(N - a * a - b * b) != null) {int c = cache.get(N - a * a - b * b);int d = (int) sqrt(N - a * a - b * b - c * c);System.out.printf("%d %d %d %d\n", a, b, c, d);return;}}}} }

    Map小練習

    package provincialGames_07_2016;import java.util.Map; import java.util.Set;import java.util.Iterator;import java.util.HashMap;public class A08_Map {public static void main(String[] args) {// 創建Map對象Map<String, String> map = new HashMap<String, String>(); // 數據采用的哈希表結構// 給map中添加元素map.put("星期一", "Monday");map.put("星期日", "Sunday");System.out.println(map); // {星期日=Sunday, 星期一=Monday}// 當給Map中添加元素,會返回key對應的原來的value值,若key沒有對應的值,返回nullSystem.out.println(map.put("星期一", "Mon")); // MondaySystem.out.println(map); // {星期日=Sunday, 星期一=Mon}// 根據指定的key獲取對應的valueString en = map.get("星期日");System.out.println(en); // Sunday// 根據key刪除元素,會返回key對應的value值String value = map.remove("星期日");System.out.println(value); // SundaySystem.out.println(map); // {星期一=Mon}Set<String> keySet = map.keySet();// 遍歷存放所有key的Set集合Iterator<String> it = keySet.iterator();while (it.hasNext()) { // 利用了Iterator迭代器**// 得到每一個keyString key1 = it.next();// 通過key獲取對應的valueString value1 = map.get(key1);System.out.println(" @:"+key1 + "=" + value1);}} }

    九、取球博弈

    取球博弈

    兩個人玩取球的游戲。
    一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個數目。
    如果無法繼續取球,則游戲結束。
    此時,持有奇數個球的一方獲勝。
    如果兩人都是奇數,則為平局。

    假設雙方都采用最聰明的取法,
    第一個取球的人一定能贏嗎?
    試編程解決這個問題。

    輸入格式:
    第一行3個正整數n1 n2 n3,空格分開,表示每次可取的數目 (0<n1,n2,n3<100)
    第二行5個正整數x1 x2 ... x5,空格分開,表示5局的初始球數(0<xi<1000)

    輸出格式:
    一行5個字符,空格分開。分別表示每局先取球的人能否獲勝。
    能獲勝則輸出+,
    次之,如有辦法逼平對手,輸出0,
    無論如何都會輸,則輸出-

    例如,輸入:
    1 2 3
    1 2 3 4 5

    程序應該輸出:
    + 0 + 0 -

    再例如,輸入:
    1 4 5
    10 11 12 13 15

    程序應該輸出:
    0 - 0 + +

    再例如,輸入:
    2 3 5
    7 8 9 10 11

    程序應該輸出:
    + 0 0 0 0


    資源約定:
    峰值內存消耗(含虛擬機) < 256M
    CPU消耗 ?< 3000ms


    請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

    所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
    注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
    注意:主類的名字必須是:Main,否則按無效代碼處理。

    package provincialGames_07_2016_JavaB;import java.util.Arrays; import java.util.Map; import java.util.Scanner;public class A09_取球博弈 {private static int[] n;public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = new int[3];for (int i = 0; i < 3; i++) {n[i] = sc.nextInt();}Arrays.sort(n); // 排序for (int i = 0; i < 5; i++) {int num = sc.nextInt();char res = f(num, 0, 0);System.out.print(res + " ");}System.out.println();}static char[][][] cache = new char[1000][2][2];/*** 參數代表著當前取球人面臨的局面* * @param num 球的總數* @param me 我方持有的數目-->我方數目的奇偶性* @param you 對手持有的數目-->對方數目的奇偶性* @return*/private static char f(int num, int me, int you) {if (num < n[0]) // 不夠取{if ((me & 1) == 1 && (you & 1) == 0)return '+';else if ((me & 1) == 0 && (you & 1) == 1)return '-';elsereturn '0';}if (cache[num][me][you] != '\0')return cache[num][me][you];boolean ping = false;for (int i = 0; i < 3; i++) {if (num >= n[i]) { // 注意此處,傳遞me和you的奇偶性char res = f(num - n[i], you, (n[i] & 1) == 0 ? me : (1 - me));if (res == '-') {cache[num][me][you] = '+';return '+';}if (res == '0')ping = true;}}// 如果能走到第這行,說明不存在對手輸的情況,那么是否存在平的情況if (ping) {cache[num][me][you] = '0';return '0';} else {cache[num][me][you] = '-';return '-';}} }

    十、壓縮變換

    壓縮變換

    小明最近在研究壓縮算法。
    他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。
    然而,要使數值很小是一個挑戰。

    最近,小明需要壓縮一些正整數的序列,這些序列的特點是,后面出現的數字很大可能是剛出現過不久的數字。對于這種特殊的序列,小明準備對序列做一個變換來減小數字的值。

    變換的過程如下:
    從左到右枚舉序列,每枚舉到一個數字,如果這個數字沒有出現過,剛將數字變換成它的相反數,如果數字出現過,則看它在原序列中最后的一次出現后面(且在當前數前面)出現了幾種數字,用這個種類數替換原來的數字。

    比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在變換過程為:
    a1: 1未出現過,所以a1變為-1;
    a2: 2未出現過,所以a2變為-2;
    a3: 2出現過,最后一次為原序列的a2,在a2后、a3前有0種數字,所以a3變為0;
    a4: 1出現過,最后一次為原序列的a1,在a1后、a4前有1種數字,所以a4變為1;
    a5: 2出現過,最后一次為原序列的a3,在a3后、a5前有1種數字,所以a5變為1。
    現在,給出原序列,請問,按這種變換規則變換后的序列是什么。

    輸入格式:
    輸入第一行包含一個整數n,表示序列的長度。
    第二行包含n個正整數,表示輸入序列。

    輸出格式:
    輸出一行,包含n個數,表示變換后的序列。

    例如,輸入:
    5
    1 2 2 1 2

    程序應該輸出:
    -1 -2 0 1 1

    再例如,輸入:
    12
    1 1 2 3 2 3 1 2 2 2 3 1

    程序應該輸出:
    -1 0 -2 -3 1 1 2 2 0 0 2 2

    數據規模與約定
    對于30%的數據,n<=1000;
    對于50%的數據,n<=30000;
    對于100%的數據,1 <=n<=100000,1<=ai<=10^9


    資源約定:
    峰值內存消耗(含虛擬機) < 256M
    CPU消耗 ?< 3000ms


    請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

    所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
    注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
    注意:主類的名字必須是:Main,否則按無效代碼處理。

    ?

    30分

    package provincialGames_07_2016_JavaB;import java.util.*;public class A10_壓縮變換 { // 30分static Map<Integer, Integer> lastIndex = new HashMap<Integer, Integer>();// 數字與下標的映射static int[] data;// 記錄原始數據static int[] ans;// 記錄答案private static int n;public static void main(String[] args) {// 處理輸入Scanner sc = new Scanner(System.in);n = sc.nextInt();data = new int[n];ans = new int[n];for (int i = 0; i < n; i++) {int num = sc.nextInt();data[i] = num;if (lastIndex.get(num) == null) {// 沒出現過ans[i] = -num;} else {// 統計p_num和i之間有多少不同的數字Set<Integer> set = new HashSet<Integer>();for (int j = lastIndex.get(num) + 1; j < i; j++) {set.add(data[j]);}ans[i] = set.size();}lastIndex.put(num, i);// 更新數字最后出現的位置}for (int i = 0; i < n; i++) {System.out.print(ans[i] + " ");}} }

    100分

    package provincialGames_07_2016_JavaB;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.PrintStream;import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class A10_壓縮變換2 {static Map<Integer, Integer> lastIndex = new HashMap<Integer, Integer>(); // 數字與下標的映射static int[] a;// 記錄原始數據static int[] ans;// 記錄答案static int[] b;// 這是一個01序列,某一個位置p上的數字為1,代表著a[p]這個數字最后出現的位置是p,而a[p]曾經出現過的位置上都是0private static int n;private static SegTree root;public static void main(String[] args) throws FileNotFoundException {System.setIn(new FileInputStream(new File("F:\\Java\\eclipse-jee-2019-09-R-win32-x86_64\\eclipse-workspace\\zLanQiao\\src\\provincialGames_07_2016\\data10\\in8.txt")));System.setOut(new PrintStream(new File("F:\\Java\\eclipse-jee-2019-09-R-win32-x86_64\\eclipse-workspace\\zLanQiao\\src\\provincialGames_07_2016\\data10\\output8.txt")));// 處理輸入Scanner sc = new Scanner(System.in);n = sc.nextInt();a = new int[n];ans = new int[n];b = new int[n];root = buildSegTree(0, n - 1);for (int i = 0; i < n; i++) {int num = sc.nextInt();a[i] = num;Integer preIndex = lastIndex.get(num);if (preIndex == null)// 沒出現過{ans[i] = -num;b[i] = 1;update(root, i, 1);} else {// 統計p_num和i之間有多少不同的數字ans[i] = query(root, preIndex + 1, i - 1);// 統計兩個位置之間的1的個數==>求區間和b[preIndex] = 0;b[i] = 1;update(root, preIndex, -1);update(root, i, 1);}lastIndex.put(num, i);// 更新}for (int i = 0; i < n; i++) {System.out.print(ans[i] + " ");}}private static int query(SegTree tree, int x, int y) {int l = tree.l;int r = tree.r;if (x <= l && y >= r)return tree.sum;int mid = (l + r) / 2;int ans = 0;if (x <= mid)ans += query(tree.lson, x, y);if (y > mid)ans += query(tree.rson, x, y);return ans;}// 構建線段樹private static SegTree buildSegTree(int l, int r) {SegTree segTree = new SegTree(l, r);if (l == r) {segTree.sum = b[l];return segTree;}int mid = (l + r) / 2;SegTree lson = buildSegTree(l, mid);SegTree rson = buildSegTree(mid + 1, r);segTree.lson = lson;segTree.rson = rson;segTree.sum = lson.sum + rson.sum;return segTree;}static void update(SegTree tree, int p, int i) {if (tree == null)return;// 更新根節點的sumtree.sum += i;int l = tree.l;int r = tree.r;int mid = (l + r) >> 1;if (p <= mid) {update(tree.lson, p, i);} else {update(tree.rson, p, i);}}static class SegTree {int l, r;// 所有區間int sum;// 區間和SegTree lson;// 左子樹SegTree rson;// 右子樹public SegTree(int l, int r) {this.l = l;this.r = r;}} }

    小結

    01 煤球數目 找規律 簡單計算
    02 生日蠟燭 枚舉: 1兩個年齡 2過生日的次數,等差數列求和的公式
    03 湊算式 全排列+check
    04 分小組 邏輯
    05 抽簽遞歸,搞清楚參數的含義和參數的變化方向
    06 方格填數 全排列+check
    07**** 剪郵票 全排列(帶重復元素的全排列,要用套路全排套路1) +標注(二維數組上標注01) +dfs求連通塊數目
    08 四平方和 枚舉優化(hash緩存)
    09*** 取球博弈 典型的博弈框架(帶平局)
    10**** 壓縮變換 hash查找+標注(一維數組上標注01便于區間求和) +區間樹(線段樹)

    總結

    以上是生活随笔為你收集整理的2016年 第7届 蓝桥杯 Java B组 省赛解析及总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。