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

歡迎訪問 生活随笔!

生活随笔

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

java

第十届蓝桥杯大赛软件类决赛 Java大学C组

發布時間:2024/1/8 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十届蓝桥杯大赛软件类决赛 Java大学C组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

藍橋杯2019國賽Java大學C組題

    • 試題 A: 奇數倍數
    • 試題 B: 遞增序列
    • 試題 C: 平方拆分
    • 試題 D: 切割
    • 試題 E: 序列求和
    • 試題 F: 最長子序列
    • 試題 G: 數正方形
    • 試題 H: 矩陣計數

試題 A: 奇數倍數

【問題描述】
請你找到最小的整數 X 同時滿足:
? X 是 2019 的整倍數
? X 的每一位數字都是奇數
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可
本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分

【分析】
這題非常簡單只需找出2019的倍數數之后,然后逐位判斷是否是奇數,注意0也是偶數,有0的也不算
【代碼演示】

public class Main {public static void main(String[] args) {for (int i = 2019; i < 500000; i += 2019) {String str = i + "";for (int j = 0; j < str.length(); j++) {if (Integer.parseInt(str.charAt(j) + "") % 2 == 0) {break;}if (j==str.length()-1){System.out.println(i);break;}}}}

[答案] 139311

試題 B: 遞增序列

【問題描述】
對于一個字母矩陣,我們稱矩陣中的一個遞增序列是指在矩陣中找到兩個
字母,它們在同一行,同一列,或者在同一 45 度的斜線上,這兩個字母從左向
右看、或者從上向下看是遞增的。
例如,如下矩陣中
LANN
QIAO
有LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN 等 13 個
遞增序列。注意當兩個字母是從左下到右上排列時,從左向右看和從上向下看
是不同的順序。
對于下面的 30 行 50 列的矩陣,請問總共有多少個遞增序列?(如果你把
以下文字復制到文本文件中,請務必檢查復制的內容是否與文檔中的一致。在
試題目錄下有一個文件 inc.txt,內容與下面的文本相同)

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX

【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一
個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分
【分析】
這題需要使用IO流來讀取文件,然后判斷每個字符的五個方向是否符合遞增序列,為什么是五個方向呢?因為題目中說每兩個字符在同一行、同一列、同一45度中,必須是從左往右看、從上往下看是遞增的,所以只有右上、右、右下、下、左下,這五個方向,然后用種子搜索算法,尋找每個字符是否符合條件
【代碼演示】

import java.io.*; import java.util.Arrays; /**** 種子搜索算法**/ public class Main {public static void main(String[] args) throws Exception {//記錄總數int sum = 0;//獲取文件中所有字符并儲存在二維數組中char[][] c = new char[30][50];int index = 0;//IO流讀取文件BufferedReader buf = new BufferedReader(new FileReader(new File("src/tt.text")));String s;while ((s = buf.readLine()) != null) {c[index++] = s.toCharArray();}//定義了每個字符的各個方向int[][] arr = {{-1, 1}, {1, 0}, {1, 1}, {0, 1}, {1, -1}};for (int i = 0; i < 30; i++) {for (int j = 0; j < 50; j++) {for (int k = 0; k < 5; k++) {int x = i, y = j;while (true) {x += arr[k][0];y += arr[k][1];if (x < 0 || y < 0 || x >= 30 || y >= 50) {break;}if (c[x][y] > c[i][j]) {sum++;}}}}}System.out.println(sum);} }

試題 C: 平方拆分

【問題描述】
將 2019 拆分為若干個兩兩不同的完全平方數之和,一共有多少種不同的方
法?
注意交換順序視為同一種方法,例如 132 + 252 + 352 = 2019 與 132 + 352 +
252 = 2019 視為同一種方法。
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一
個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
【分析】
首先不同數的平方最高到45,因為45^2就大于2019了,所有從1到45中找,使用回溯算法,每次執行方法用2019-m*m(m=i),i為每次增加的1-45的數,然后下次執行方法時,判斷2019是否為0,為0就加一次次數,為負數就return
【代碼演示】

public class Main {/*** 將 2019 拆分為若干個兩兩不同的完全平方數之和,一共有多少種不同的方法?* 注意交換順序視為同一種方法* 例如 132 + 252 + 352 = 2019 與 132 + 352 + 252 = 2019 視為同一種方法。** 使用回溯算法*/public static void main(String[] args) {help(1,45,2019);System.out.println(sum);}static int sum=0;public static void help(int i,int j,int k){//說明平方和比2019大,就停止if (k<0) return;//說明平方和正好等于2019if (k==0) {sum++;return;}for (int m = i; m < j; m++) {help(m+1,j,k-m*m);}} }

試題 D: 切割

【問題描述】
在 4 × 4 的方格矩陣中畫一條直線。則直線穿過的方格集合有多少種不同的
可能?
這個里直線穿過一個方格當且僅當直線將該方格分割成面積都大于 0 的兩
部分

試題 E: 序列求和

【問題描述】
學習了約數后,小明對于約數很好奇,他發現,給定一個正整數 t,總是可
以找到含有 t 個約數的整數。小明對于含有 t 個約數的最小數非常感興趣,并
把它定義為 S t 。
例如 S 1 = 1, S 2 = 2, S 3 = 4, S 4 = 6,· · · 。
現在小明想知道,前 60 個 S i 的和是多少?即 S 1 + S 2 + · · · + S 60 是多少?
【分析】
本題其實不難,就是數目太大,題目中求約數有1-60的數總和,已知100以內的質因數有2,3,5,7,11,13,17…等,然后舉個例子,當求約數為10的數的時候,給10分解因數,為2*5,這個數就是2^(5-1) * 3 ^(2-1)=48,按照這個規律可以求出S1到S60的和。規律就是這個數的約數分解因數,然后從大到小分別給質因數當次方-1,最后求每一項的乘積,就是這個數
【代碼演示】

import java.util.ArrayList; import java.util.LinkedList; import java.util.List;public class Main {/*** 學習了約數后,小明對于約數很好奇* 他發現,給定一個正整數 t,總是可以找到含有 t個約數的整數* 小明對于含有 t 個約數的最小數非常感興趣,并 把它定義為 St* 例如 S1 = 1, S2 = 2, S3 = 4, S4 = 6,···。 現在小明想知道* 前 60 個 Si 的和是多少?即 S1 + S2 +···+S60 是多少?*/public static void main(String[] args) {//尋找有60個約數的最小數,然后求出有1個到60個的約數的和long sum = 0;//記錄總和List<Integer> list = new ArrayList<>();for (int i = 2; i <= 100; i++) {if (help(i) != 0) {list.add(help(i));}}LinkedList<Integer> link = new LinkedList();for (int i = 1; i < 61; i++) {link = help2(link, i);long som = 1;for (int j = 0; j < link.size(); j++) {som *= Math.pow(list.get(j), link.get(j) - 1);}link.clear();sum += som;System.out.println(i + " " + som);}System.out.println(sum);}//分解質因數public static int help(int n) {for (int i = 2; i < n; i++) {if (n % i == 0) return 0;if (i == n - 1) return n;}return n;}//尋找每個數的約數的因數public static LinkedList<Integer> help2(LinkedList<Integer> linkedList, int n) {int k = 2;while (n > 1) {if (n % k == 0) {n /= k;linkedList.addFirst(k);} else k++;}return linkedList;} }

【答案:292809912969721375】

試題 F: 最長子序列

【問題描述】
我們稱一個字符串 S 包含字符串 T 是指 T 是 S 的一個子序列,即可以從
字符串 S 中抽出若干個字符,它們按原來的順序組合成一個新的字符串與 T 完
全一樣。
給定兩個字符串 S 和 T,請問 T 中從第一個字符開始最長連續多少個字符
被 S 包含?
【輸入格式】
輸入兩行,每行一個字符串。第一行的字符串為 S,第二行的字符串為 T。
兩個字符串均非空而且只包含大寫英文字母。
【輸出格式】
輸出一個整數,表示答案。
【樣例輸入】
ABCDEABCD
AABZ
【樣例輸出】
3
【分析】
使用HashMap的key儲存S字符串每一位,然后value儲存每一位的數量,再循環T的每一位,如果不能從Map里找到該key,就停止,找到之后,value值小于1也停止,如果都符合條件,就cont++
【代碼演示】

import java.util.HashMap; import java.util.Scanner;public class Main {/*** 我們稱一個字符串 S 包含字符串 T 是指 T 是 S 的一個子序列,* 即可以從 字符串 S 中抽出若干個字符,它們按原來的順序組合成一個新的字符串與 T 完 全一樣* 給定兩個字符串 S 和 T,請問 T 中從第一個字符開始最長連續多少個字符 被 S 包含?* * 【輸入格式】* 輸入兩行,每行一個字符串。第一行的字符串為 S,第二行的字符串為 T* 兩個字符串均非空而且只包含大寫英文字母。* * 【輸出格式】* 輸出一個整數,表示答案。* 【樣例輸入】 ABCDEABCD* AABZ* * 【樣例輸出】 3*/public static void main(String[] args) {Scanner sr = new Scanner(System.in);String S = sr.next();String T = sr.next();int cont = 0;HashMap<Character, Integer> map = new HashMap();for (int i = 0; i < S.length(); i++) {if (map.get(S.charAt(i)) == null) {map.put(S.charAt(i), 1);continue;}map.put(S.charAt(i), map.get(S.charAt(i)) + 1);}for (int i = 0; i < T.length(); i++) {if (map.get(T.charAt(i)) == null) break;if (map.get(T.charAt(i)) > 0) {cont++;map.put(T.charAt(i), map.get(T.charAt(i)) - 1);}}System.out.println(cont);} }

試題 G: 數正方形

【問題描述】
在一個 N × N 的點陣上,取其中 4 個點恰好組成一個正方形的 4 個頂點,
一共有多少種不同的取法?
由于結果可能非常大,你只需要輸出模 10^9 + 7 的余數


【分析】
如圖所示,當正方形為22時,正方形邊上只有一個正方形,當為33時,有2個正方形,當為11時,沒有;所以當為nn時,一共有11(n-1)+22(n-2)+33(n-3)…nn(n-n),ps:圖畫的不是特別好,勉強能看吧
【代碼演示】

import java.util.Scanner;public class Main {/*** 在一個 N ×N 的點陣上,取其中 4 個點恰好組成一個正方形的 4 個頂點,* 一共有多少種不同的取法?* 由于結果可能非常大,你只需要輸出模 10^9 + 7 的余數** 【輸入格式】* 輸入包含一個整數 N* 【輸出格式】* 輸出一個整數代表答案。* 【樣例輸入】 4* 【樣例輸出】 20* **/public static void main(String[] args) {Scanner sr=new Scanner(System.in);int n=sr.nextInt();final int mod=1000000007;long sum=0;for (int i = 1; i <n ; i++) {//為什么老是要取余mod呢,因為數太大了,每次要多取余幾次(dogo)sum=(sum+(n-i)*i%mod*i)%mod;}System.out.println(sum);} }

【輸入格式】
輸入包含一個整數 N。
【輸出格式】
輸出一個整數代表答案。
【樣例輸入】
4
【樣例輸出】
20

試題 H: 矩陣計數

【問題描述】
一個 N × M 的方格矩陣,每一個方格中包含一個字符 O 或者字符 X。
要求矩陣中不存在連續一行 3 個 X 或者連續一列 3 個 X。
問這樣的矩陣一共有多少種?
【輸入格式】
輸入一行包含兩個整數 N 和 M。
【輸出格式】
輸出一個整數代表答案。
【樣例輸入】
2 3
【樣例輸出】
49
【代碼演示】

import java.util.Scanner;public class Main {/*** 一個 N×M 的方格矩陣,每一個方格中包含一個字符 O 或者字符 X* 要求矩陣中不存在連續一行 3 個 X 或者連續一列 3 個 X* 問這樣的矩陣一共有多少種?* 【輸入格式】* 輸入一行包含兩個整數 N 和 M。* 【輸出格式】* 輸出一個整數代表答案。* 【樣例輸入】 2 3* 【樣例輸出】 49*/public static void main(String[] args) {dfs(0, 0);System.out.println(cont);}static Scanner sr = new Scanner(System.in);static int n = sr.nextInt();static int m = sr.nextInt();static int[][] arr = new int[n][m];//0表示O ,1表示Xstatic int cont;public static void dfs(int i, int j) {if (i == n) {cont++;return;}if (help(i, j)) {arr[i][j] = 1;dfs(i + (j + 1) / m, (j + 1) % m);arr[i][j] = 0;}dfs(i + (j + 1) / m, (j + 1) % m);}public static boolean help(int i, int j) {//行數超過2行if (i > 1) {if (arr[i - 1][j] == arr[i - 2][j] && arr[i - 2][j] == 1) return false;}//列數超過2行if (j > 1) {if (arr[i][j - 1] == arr[i][j - 2] && arr[i][j - 2] == 1) return false;}return true;}}

總結

以上是生活随笔為你收集整理的第十届蓝桥杯大赛软件类决赛 Java大学C组的全部內容,希望文章能夠幫你解決所遇到的問題。

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