Java藍橋杯刷題記錄(一)
1.單詞分析
題目描述
小藍正在學習一門神奇的語言,這門語言中的單詞都是由小寫英文字母組 成,有些單詞很長,遠遠超過正常英文單詞的長度。小藍學了很長時間也記不住一些單詞,他準備不再完全記憶這些單詞,而是根據單詞中哪個字母出現得最多來分辨單詞。
現在,請你幫助小藍,給了一個單詞後,幫助他找到出現最多的字母和這 個字母出現的次數。
輸入描述
輸入一行包含一個單詞,單詞只由小寫英文字母組成。
對於所有的評測用例,輸入的單詞長度不超過 1000。
輸出描述
輸出兩行,第一行包含一個英文字母,表示單詞中出現得最多的字母是哪 個。如果有多個字母出現的次數相等,輸出字典序最小的那個。
第二行包含一個整數,表示出現得最多的那個字母在單詞中出現的次數。
輸入輸出樣例
示例 1
輸入
lanqiao
輸出
a
2
示例 2
輸入
longlonglongistoolong
輸出
o
6
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 256M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼...View CodeString str = scan.nextLine(); int[] a = new int [26]; for(int i=0; i < str.length(); i++){ a[str.charAt(i) - 'a'] ++; } char ch = 'a'; int max = 0; for(int i=0; i<26;i++){ if(a[i] > max){ max = a[i]; ch= (char)('a'+i); } } System.out.println(ch); System.out.println(max); scan.close(); } }
2.成績統計
題目描述
小藍給學生們組織了一場考試,卷面總分為 100 分,每個學生的得分都是一個 0 到 100 的整數。
如果得分至少是 60 分,則稱為及格。如果得分至少為 85 分,則稱為優秀。
請計算及格率和優秀率,用百分數表示,百分號前的部分四捨五入保留整 數。
輸入描述
輸入的第一行包含一個整數 n\ (1 \leq n \leq 10^4)n (1≤n≤104),表示考試人數。
接下來 nn 行,每行包含一個 0 至 100 的整數,表示一個學生的得分。
輸出描述
輸出兩行,每行一個百分數,分別表示及格率和優秀率。百分號前的部分 四捨五入保留整數。
輸入輸出樣例
示例
輸入
7
80
92
56
74
88
100
0
輸出
71%
43%
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 256M
程式碼
import java.util.Scanner; import java.lang.*; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... int num = scan.nextInt(); double yx = 0; double jg = 0; for(int i = 0; i < num; i++){ int a = scan.nextInt(); if(a >= 60){ if(a >= 85){ yx++; } jg++; } } System.out.println(Math.round(jg*100/num) + "%"); System.out.println(Math.round(yx*100/num) + "%"); scan.close(); } }View Code
3.卡片
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
小藍有很多數字卡片,每張卡片上都是數字 00 到 99。 小藍準備用這些卡片來拼一些數,他想從 11 開始拼出正整數,每拼一個, 就儲存起來,卡片就不能用來拼其它數了。 小藍想知道自己能從 11 拼到多少。 例如,當小藍有 3030 張卡片,其中 00 到 99 各 33 張,則小藍可以拼出 11 到 1010, 但是拼 1111 時卡片 11 已經只有一張了,不夠拼出 1111。 現在小藍手裡有 00 到 99 的卡片各 20212021 張,共 2021020210 張,請問小藍可以從 11 拼到多少? 提示:建議使用計算機程式設計解決問題
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... int count = 0; for(int i=1; i<20210; i++){ String str = i + ""; for(int j=0; j<str.length(); j++){ if(str.charAt(j) == '1') count ++; } if(count == 2021){ System.out.println(str); break; } } scan.close(); } }View Code
4.空間
題目描述
小藍準備用 256MB256MB 的記憶體空間開一個數組,陣列的每個元素都是 3232 位 二進位制整數,如果不考慮程式佔用的空間和維護記憶體需要的輔助空間,請問 256MB256MB 的空間可以儲存多少個 3232 位二進位制整數?
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... int a = 256*8*1024*1024/32; System.out.println(Math.abs(a)); scan.close(); } }View Code
5.走網格
題目描述
小藍在一個 nn 行 mm 列的方格圖中玩一個遊戲。
開始時,小藍站在方格圖的左上角,即第 11 行第 11 列。
小藍可以在方格圖上走動,走動時,如果當前在第 rr 行第 cc 列,他不能走到行號比 rr 小的行,也不能走到列號比 cc 小的列。同時,他一步走的直線距離不超過 33。
例如,如果當前小藍在第 33 行第 55 列,他下一步可以走到第 33 行第 66 列、第 33 行第 77 列、第 33 行第 88 列、第 44 行第 55 列、第 44 行第 66 列、第 44 行第 77 列、第 55 行第 55 列、第 55 行第 66 列、第 66 行第 55 列之一。
小藍最終要走到第 nn 行第 mm 列。
在圖中,有的位置有獎勵,走上去即可獲得,有的位置有懲罰,走上去就要接受懲罰。獎勵和懲罰最終抽象成一個權值,獎勵為正,懲罰為負。
小藍希望,從第 11 行第 11 列走到第 nn 行第 mm 列後,總的權值和最大。請問最大是多少?
輸入描述
輸入的第一行包含兩個整數 n, mn,m,表示圖的大小。
接下來 nn 行,每行 mm 個整數,表示方格圖中每個點的權值。
其中,1 \leq n \leq 100,-10^4 \leq 權值 \leq 10^41≤n≤100,−104≤權值≤104。
輸出描述
輸出一個整數,表示最大權值和。
輸入輸出樣例
示例 1
輸入
3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4
輸出
15
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; public class Main { static Scanner sr = new Scanner(System.in); static int n = sr.nextInt(); static int m = sr.nextInt(); static int[][] map = new int[n][m]; static int dx[] = {0,0,0,1,2,3,1,2,1}; static int dy[] = {1,2,3,0,0,0,1,1,2}; static int max_length = Integer.MIN_VALUE; public static void main(String[] args) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { map[i][j] = sr.nextInt(); } } dfs(0,0, map[0][0]); System.out.println(max_length); } private static void dfs(int i, int j, int length) { // TODO Auto-generated method stub if(i==n-1 && j== m-1) max_length = Math.max(length, max_length);//更新最長長度 for (int k = 0; k < dx.length; k++) { int nx = i + dx[k]; int ny = j + dy[k]; //根據範圍內座標進行遞迴 if (nx >= 0 && ny >= 0 && nx < n && ny < m ) { //進行遞迴 dfs(nx,ny,length+map[nx][ny]); } } } }View Code
6.貨物擺放
題目描述
小藍有一個超大的倉庫,可以擺放很多貨物。
現在,小藍有 nn 箱貨物要擺放在倉庫,每箱貨物都是規則的正方體。小藍規定了長、寬、高三個互相垂直的方向,每箱貨物的邊都必須嚴格平行於長、寬、高。
小藍希望所有的貨物最終擺成一個大的長方體。即在長、寬、高的方向上分別堆 LL、WW、HH 的貨物,滿足 n = L \times W \times Hn=L×W×H。
給定 nn,請問有多少種堆放貨物的方案滿足要求。
例如,當 n = 4n=4 時,有以下 66 種方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
請問,當 n = 2021041820210418n=2021041820210418 (注意有 1616 位數字)時,總共有多少種方案?
提示:建議使用計算機程式設計解決問題。
答案提交
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
程式碼
import java.util.Scanner; import java.util.ArrayList; import java.util.List; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... Long num = new Long("2021041820210418"); int counts = 0; List<Long> yinzi = new ArrayList<>(); for(long i = 1; i * i <= num;i++){ if(num % i == 0){ yinzi.add(i); if(num / i != i){ yinzi.add(num/i); } } } int res = 0; for(long i:yinzi){ for(long j:yinzi){ for(long t:yinzi){ if(i * j * t == num){ res++; } } } } System.out.println(res); scan.close(); } }View Code
7.時間顯示
題目描述
小藍要和朋友合作開發一個時間顯示的網站。
在伺服器上,朋友已經獲取了當前的時間,用一個整數表示,值為從 19701970 年 11 月 11 日 00:00:0000:00:00 到當前時刻經過的毫秒數。
現在,小藍要在客戶端顯示出這個時間。小藍不用顯示出年月日,只需要顯示出時分秒即可,毫秒也不用顯示,直接捨去即可。
給定一個用整數表示的時間,請將這個時間對應的時分秒輸出。
輸入描述
輸入一行包含一個整數,表示時間。
輸出描述
輸出時分秒錶示的當前時間,格式形如 HH:MM:SS
,其中 HH
表示時,值為 00 到 2323,MM
表示分,值為 00 到 5959,SS
表示秒,值為 00 到 5959。時、分、秒 不足兩位時補前導 00。
輸入輸出樣例
示例 1
輸入
46800999
輸出
13:00:00
示例 2
輸入
1618708103123
輸出
01:08:23
評測用例規模與約定
對於所有評測用例,給定的時間為不超過 10^{18}1018 的正整數。
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); long num = scan.nextLong(); scan.close(); long allseconds = num/1000; long seconds = allseconds%60; long allmins = allseconds/60; long mins = allmins%60; long allhours = allmins/60; long hours = allhours%24; String date = String.format("%02d", hours)+":"+String.format("%02d", mins)+":"+String.format("%02d", seconds); System.out.println(date); } }View Code
8.最短路
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
如下圖所示,GG 是一個無向圖,其中藍色邊的長度是 11、橘色邊的長度是 22、綠色邊的長度是 33。
則從 AA 到 SS 的最短距離是多少?
程式碼
import java.util.*; public class Main { private static final Scanner in = new Scanner(System.in); private static List<int[]> edges = new ArrayList<>(); public static void main(String[] args) { add('A', 'C', 1); add('A', 'D', 1); add('A', 'E', 1); add('D', 'E', 1); add('E', 'I', 1); add('D', 'H', 1); add('H', 'I', 1); add('B', 'G', 1); add('F', 'G', 1); add('F', 'J', 1); add('K', 'N', 1); add('L', 'M', 1); add('N', 'P', 1); add('P', 'O', 1); add('O', 'Q', 1); add('Q', 'M', 1); add('L', 'R', 1); add('S', 'R', 1); add('M', 'S', 1); add('A', 'B', 2); add('B', 'J', 2); add('D', 'I', 2); add('D', 'G', 2); add('G', 'K', 2); add('K', 'P', 2); add('J', 'S', 2); add('M', 'N', 2); add('H', 'L', 2); add('E', 'I', 3); add('I', 'M', 3); add('G', 'I', 3); add('C', 'D', 3); add('C', 'G', 3); add('C', 'F', 3); add('O', 'R', 3); add('K', 'L', 3); int n = edges.size(); int[] dist = new int[128]; Arrays.fill(dist, Integer.MAX_VALUE >> 1); dist['A'] = 0; for (int i = 0; i < n - 1; i++) { for (int[] edge : edges) { int u = edge[0], v = edge[1], w = edge[2]; dist[v] = Math.min(dist[v], dist[u] + w); } } System.out.println(dist['S']); } private static void add(char u, char v, int w) { edges.add(new int[] {u, v, w}); edges.add(new int[] {v, u, w}); } }View Code
9.迴文日期
題目描述
2020 年春節期間,有一個特殊的日期引起了大家的注意:2020 年 2 月 2 日。因為如果將這個日期按 “yyyymmdd” 的格式寫成一個 8 位數是 20200202,恰好是一個迴文數。我們稱這樣的日期是迴文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。對此小明很不認同,因為不到 2 年之後就是下一個迴文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 並不僅僅是一個迴文日期,還是一個 ABABBABA 型的迴文日期。對此小明也不認同,因為大約 100 年後就能遇到下一個 ABABBABA 型的迴文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,頂多算 “千年兩遇”。
給定一個 8 位數的日期,請你計算該日期之後下一個迴文日期和下一個 ABABBABA 型的迴文日期各是哪一天。
輸入描述
輸入包含一個八位整數 NN,表示日期。
對於所有評測用例,10000101 \leq N \leq 8999123110000101≤N≤89991231,保證 NN 是一個合法日期的 8 位數表示。
輸出描述
輸出兩行,每行 1 個八位數。第一行表示下一個迴文日期,第二行表示下一個 ABABBABA 型的迴文日期。
輸入輸出樣例
示例
輸入
20200202
輸出
20211202
21211212
程式碼
import java.util.*; import java.text.SimpleDateFormat; //思路:擷取使用者輸入的年份,把年份倒多來再拼接上去形成年月日,再來判斷日期是否合法 和 是否符合ABAB型 public class Main{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); String num = Integer.toString(n); // boolean condition1 = false, condition2 = false; // 迴圈一次加一年 for (int i = n; !condition1 || !condition2; i += 10000) { String date = Integer.toString(i); // 擷取年份字串也就是前半部分,再做反轉接在後面形成迴文 StringBuffer sb = new StringBuffer(date.substring(0, 4)); String sb2 = sb.reverse().toString(); String string = sb.reverse().toString().concat(sb2); // 判斷迴文是否合法 if (!condition1 && isDate(string) && string.compareTo(num) > 0) { System.out.println(string); condition1 = true; } // 加上一個判斷是否ABAB型 if (!condition2 && isDate(string) && string.compareTo(num) > 0 && string.substring(0, 2).equals(string.substring(2, 4))) { System.out.println(string); condition2 = true; } } scan.close(); } // 判斷是否合法日期 public static boolean isDate(String date) { String dt = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8); // 日期格式化 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { // 設為false能嚴格驗證日期 sdf.setLenient(false); // 解析生成日期 不合法就丟擲異常 sdf.parse(dt); } catch (Exception e) { return false; } return true; } }View Code
10.門牌製作
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
小藍要為一條街的住戶製作門牌號。
這條街一共有 20202020 位住戶,門牌號從 11 到 20202020 編號。
小藍製作門牌的方法是先製作 00 到 99 這幾個數字字元,最後根據需要將字元貼上到門牌上,例如門牌 1017 需要依次貼上字元 1、0、1、71、0、1、7,即需要 11 個字元 00,22 個字元 11,11 個字元 77。
請問要製作所有的 11 到 20202020 號門牌,總共需要多少個字元 22?
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... int count = 0; String str = ""; for(int i=0; i<=2020; i++){ str = i + ""; for(int j=0; j<str.length(); j++){ if(str.charAt(j)=='2') count++; } } System.out.println(count); scan.close(); } }法一
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { int count = 0; for(int i = 1; i <= 2020; i++) { int num = i; while(num != 0) { if(num%10==2) { count ++; } num /= 10; } } System.out.println(count); } }法二
11.購物單
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。
這不,大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。
小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定。
現在小明很心煩,請你幫他計算一下,需要從取款機上取多少現金,才能搞定這次購物。
取款機只能提供 100100 元面額的紙幣。小明想盡可能少取些現金,夠用就行了。 你的任務是計算出,小明最少需要取多少現金。
以下是讓人頭疼的購物單,為了保護隱私,物品名稱被隱藏了。
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半價
**** 26.75 65折
**** 130.62 半價
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半價
**** 79.54 半價
**** 278.44 7折
**** 199.26 半價
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半價
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半價
**** 218.37 半價
**** 289.69 8折
需要說明的是,8888 折指的是按標價的 88%88 計算,而 88 折是按 80%80 計算,餘者類推。 特別地,半價是按 50%50 計算。
請輸出小明要從取款機上提取的金額,單位是元。
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main{ public static void main(String []args){ double sum = 180.90*0.88+10.25*0.65+56.14*0.9+104.65*0.9+100.30*0.88+297.15*0.5+26.75*0.65+130.62*0.5+240.28*0.58+270.62*0.8+115.87*0.88+247.34*0.95+73.21*0.9+101.00*0.5+79.54*0.5+278.44*0.7+199.26*0.5+12.97*0.9+166.30*0.78+125.50*0.58+84.98*0.9+113.35*0.68+166.57*0.5+42.56*0.9+81.90*0.95+131.78*0.8+255.89*0.78+109.17*0.9+146.69*0.68+139.33*0.65+141.16*0.78+154.74*0.8+59.42*0.8+85.44*0.68+293.70*0.88+261.79*0.65+11.30*0.88+268.27*0.58+128.29*0.88+251.03*0.8+208.39*0.75+128.88*0.75+62.06*0.9+225.87*0.75+12.89*0.75+34.28*0.75+62.16*0.58+129.12*0.5+218.37*0.5+289.69*0.8; System.out.println((int)(sum+100)/100*100); } }View Code
12.成績分析
題目描述
小藍給學生們組織了一場考試,卷面總分為 100 分,每個學生的得分都是一個 0 到 100 的整數。
請計算這次考試的最高分、最低分和平均分。
輸入描述
輸入的第一行包含一個整數 n\ (1 ≤ n ≤ 10^4)n (1≤n≤104),表示考試人數。
接下來 nn 行,每行包含一個 0 至 100 的整數,表示一個學生的得分。
輸出描述
輸出三行。
第一行包含一個整數,表示最高分。
第二行包含一個整數,表示最低分。
第三行包含一個實數,四捨五入保留正好兩位小數,表示平均分。
輸入輸出樣例
示例
輸入
7
80
92
56
74
88
99
10
輸出
99
10
71.29
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 256M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... double num = scan.nextInt(); int max = 0; int min = 100; //int sum; double sum = 0;// for(int i = 0; i < num; i++){ int j = scan.nextInt(); if(max < j) max = j; if(min > j) min = j; sum += j; } double ave = sum/num; System.out.println(max); System.out.println(min); System.out.printf("%.2f",ave);//注意 是prinf不是println scan.close(); } }View Code
13.數字三角形
題目描述
上圖給出了一個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和。
路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右 邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過 1。
輸入描述
輸入的第一行包含一個整數 N\ (1 \leq N \leq 100)N (1≤N≤100),表示三角形的行數。
下面的 NN 行給出數字三角形。數字三角形上的數都是 0 至 100 之間的整數。
輸出描述
輸出一個整數,表示答案。
輸入輸出樣例
示例
輸入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
輸出
27
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 256M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[][] arr = new int[N][N]; int[][] dp = new int[N][N]; for(int i=0;i<N;i++) { for(int j=0;j<=i;j++) { arr[i][j] = sc.nextInt(); } } sc.close(); dp[0][0] = arr[0][0]; for(int i=1;i<N;i++) { dp[i][0] = dp[i-1][0] + arr[i][0]; } for(int i=1;i<N;i++) { for(int j=1;j<=i;j++) { dp[i][j] = arr[i][j] + Math.max(dp[i-1][j], dp[i-1][j-1]); } } if(N%2!=0) { System.out.println(dp[N-1][N/2]); }else { System.out.println(Math.max(dp[N-1][N/2], dp[N-1][N/2-1])); } } }View Code
14.跑步鍛鍊
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
小藍每天都鍛鍊身體。
正常情況下,小藍每天跑 11 千米。如果某天是週一或者月初(11 日),為了激勵自己,小藍要跑 22 千米。如果同時是週一或月初,小藍也是跑 22 千米。
小藍跑步已經堅持了很長時間,從 20002000 年 11 月 11 日週六(含)到 20202020 年 1010 月 11 日週四(含)。請問這段時間小藍總共跑步多少千米?
程式碼
import java.util.*; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.set(2000, 0, 1); int count = 0; while (true) { calendar.add(calendar.DAY_OF_YEAR,1); if (calendar.get(calendar.DAY_OF_WEEK) == 2 || calendar.get(calendar.DAY_OF_MONTH) == 1 ){ count += 2; }else { count ++; } // 從0開始計算,因此10月1日表示為9和2 if (calendar.get(calendar.YEAR) == 2020 && calendar.get(calendar.MONTH) == 9 && calendar.get(calendar.DAY_OF_MONTH) == 2) { break; } } System.out.print(count + 1); } }View Code
15.Z形字元
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
如下圖所示,小明用從 11 開始的正整數“蛇形”填充無限大的矩陣。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩陣第二行第二列中的數是 55。請你計算矩陣中第 2020 行第 2020 列的數是多少?
程式碼
View COde16.等差素數列
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
2,3,5,7,11,13,....2,3,5,7,11,13,.... 是素數序列。 類似:7,37,67,97,127,1577,37,67,97,127,157 這樣完全由素陣列成的等差數列,叫等差素數數列。
上邊的數列公差為 3030,長度為 66。
20042004 年,格林與華人陶哲軒合作證明了:存在任意長度的素數等差數列。 這是數論領域一項驚人的成果!
有這一理論為基礎,請你藉助手中的計算機,滿懷信心地搜尋:
長度為 1010 的等差素數列,其公差最小值是多少?
程式碼
import java.util.*; // 1:無需package // 2: 類名必須Main, 不可修改 // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args) { for(int i = 1;i<10000;i++){//指定初值 for(int j = 1;j<1000;j++){//指定公差 int k; for(k=0;k<=9;k++){//看10個數是否為素數 if(!isPrime(i+k*j)) break; } if(k==10) { System.out.println(j); return ; } } } } public static boolean isPrime(int num){ for(int i = num-1;i>1;i--){ if(num%i==0) return false; } return true; } }法一
import java.util.ArrayList; import java.util.Arrays; public class Main { public static void main(String[] args) { int length=10000000,c=1000; boolean[]b=new boolean[length]; Arrays.fill(b, true); for(int i=2;i*i<length;i++) for(int j=i*i;j<length;j+=i) b[j]=false; ArrayList<Integer> list = new ArrayList<Integer>(); for(int i=2;i*i<length;i++) if(b[i]) list.add(i); int[][] x=new int[list.size()][c]; for(int i=0;i<list.size();i++){ Integer integer = list.get(i); for (int j = 1; j < c; j++) { if(list.contains(integer-j)) x[i][j]=x[list.indexOf(integer-j)][j]+1; if(x[i][j]==9) { System.out.println(j); return; }} } } }法二
17.組隊
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
作為籃球隊教練,你需要從以下名單中選出 11 號位至 55 號位各一名球員,組成球隊的首發陣容。
每位球員擔任 11 號位至 55 號位時的評分如下表所示。請你計算首發陣容 11 號位至 55 號位的評分之和最大可能是多少?
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { public static void main(String[] args){ int [] num1 = {97,92,0,0,89,82,0,0,0,95,0,0,94,0,0,0,98,93,0,0}; int [] num2 = {90,85,0,0,83,86,0,97,0,99,0,0,91,83,0,0,83,87,0,99}; int [] num3 = {0,96,0,0,97,0,0,96,89,0,96,0,0,87,98,0,99,92,0,96}; int [] num4 = {0,0,0,80,0,0,87,0,0,0,97,93,0,0,97,93,98,96,89,95}; int [] num5 = {0,0,93,86,0,0,90,0,0,0,0,98,0,0,98,86,81,98,92,81}; int max = 0;//儲存最大值 //運用for迴圈,依次相加比較 for( int n1 = 0 ; n1 < 20 ; n1++ ){ for( int n2 = 0 ; n2 < 20 ; n2++ ){ for( int n3 = 0 ; n3 < 20 ; n3++ ){ for( int n4 = 0 ; n4 < 20 ; n4++ ){ for( int n5 = 0 ; n5 < 20 ; n5++ ){ //限定條件:每號位只能選一個人,轉換為程式思想,即陣列下標不能一樣 if( n1 != n2 && n1 != n3 && n1 != n4 && n1 != n5 && n2 != n3 && n2 != n4 && n2 != n5 && n3 != n4 && n3 != n5 && n4 != n5){ if ( max < num1[n1] + num2[n2] + num3[n3] + num4[n4] + num5[n5] ) { max = num1[n1] + num2[n2] + num3[n3] + num4[n4] + num5[n5]; //System.out.println(n1+","+n2+","+n3+","+n4+","+n5); //當 n1 = 0 ; n2 = 9 ; n3 = 14 ; n4 = 16 ; n5 = 11時,有最大值490 } } } } } } } System.out.println(max); } }View Code
18.既約分數
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
如果一個分數的分子和分母的最大公約數是 11,這個分數稱為既約分數。
例如 \frac{3}{4} ,\frac{1}{8} ,\frac{7}{1}43,81,17, 都是既約分數。
請問,有多少個既約分數,分子和分母都是 11 到 20202020 之間的整數(包括 11 和 20202020)?
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 //輾轉相除法 public class Main { public static void main(String[] args) { int sum = 0; for (int i = 1; i <= 2020; i++) { for (int j = 1; j <= 2020; j++) { if (gcd(i, j) == 1) { sum++; } } } System.out.println(sum); } //求最大公約數的一個數學公式,輾轉相除法, //歐幾里得演算法又稱輾轉相除法,是指用於計算兩個非負整數a,b的最大公約數。應用領域有數學和計算機兩個方面。計算公式gcd(a,b) = gcd(b,a mod b)。 //歐幾里得演算法和擴充套件歐幾里得演算法可使用多種程式語言實現。 public static int gcd(int a, int b) { //當b為0時,a就是他的們間的最大公約數 return b==0? a : gcd(b, a%b); } }View Code
19.特別數的和
題目描述
小明對數位中含有 2、0、1、9 的數字很感興趣(不包括前導 0),在 1 到 40 中這樣的數包括 1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。
請問,在 1 到 nn 中,所有這樣的數的和是多少?
輸入描述
輸入格式:
輸入一行包含兩個整數 n(1 \leq n \leq 10^4)n(1≤n≤104)。
輸出描述
輸出一行,包含一個整數,表示滿足條件的數的和。
輸入輸出樣例
示例
輸入
40
輸出
574
程式碼
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long sum = 0; for (int i = 1; i <= n; i++) { if (cheak(i)) { sum += i; } } System.out.println(sum); sc.close(); } private static boolean cheak(int n) { while (n != 0) { int a = n % 10; if (a == 2 || a == 0 || a == 1 || a == 9) { return true; } n /= 10; } return false; } }View Code
20.作物雜交
題目描述
作物雜交是作物栽培中重要的一步。已知有 NN 種作物 (編號 11 至 NN ),第 ii 種作物從播種到成熟的時間為 T_iTi。作物之間兩兩可以進行雜交,雜交時間取兩種中時間較長的一方。如作物 A 種植時間為 5 天,作物 B 種植時間為 7 天,則 AB 雜交花費的時間為 7 天。作物雜交會產生固定的作物,新產生的作物仍然屬於 NN 種作物中的一種。
初始時,擁有其中 MM 種作物的種子 (數量無限,可以支援多次雜交)。同時可以進行多個雜交過程。求問對於給定的目標種子,最少需要多少天能夠得到。
如存在 4 種作物 ABCD,各自的成熟時間為 5 天、7 天、3 天、8 天。初始擁有 AB 兩種作物的種子,目標種子為 D,已知雜交情況為 A × B → C,A × C → D。則最短的雜交過程為:
第 1 天到第 7 天 (作物 B 的時間),A × B → C。
第 8 天到第 12 天 (作物 A 的時間),A × C → D。
花費 12 天得到作物 D 的種子。
輸入描述
輸入的第 1 行包含 4 個整數 N, M, K, TN,M,K,T,NN 表示作物種類總數 (編號 11 至 NN),MM 表示初始擁有的作物種子型別數量,KK 表示可以雜交的方案數,TT 表示目標種子的編號。
第 2 行包含 NN 個整數,其中第 ii 個整數表示第 ii 種作物的種植時間 T_i\ (1 \leq T_i \leq 100)Ti (1≤Ti≤100)。
第 3 行包含 MM 個整數,分別表示已擁有的種子型別 K_j\ (1 \leq K_j \leq M)Kj (1≤Kj≤M),K_jKj 兩兩不同。
第 4 至 KK + 3 行,每行包含 3 個整數 A, B,CA,B,C,表示第 AA 類作物和第 BB 類作物雜交可以獲得第 CC 類作物的種子。
其中,1 \leq N \leq 2000, 2 \leq M \leq N, 1 \leq K \leq 10^5, 1 \leq T \leq N1≤N≤2000,2≤M≤N,1≤K≤105,1≤T≤N, 保證目標種子一定可以通過雜交得到。
輸出描述
輸出一個整數,表示得到目標種子的最短雜交時間。
輸入輸出樣例
示例
輸入
6 2 4 6
5 3 4 6 4 9
1 2
1 2 3
1 3 4
2 3 5
4 5 6
輸出
16
樣例說明
第 1 天至第 5 天,將編號 1 與編號 2 的作物雜交,得到編號 3 的作物種子。
第 6 天至第 10 天,將編號 1 與編號 3 的作物雜交,得到編號 4 的作物種子。
第 6 天至第 9 天,將編號 2 與編號 3 的作物雜交,得到編號 5 的作物種子。
第 11 天至第 16 天,將編號 4 與編號 5 的作物雜交,得到編號 6 的作物種子。
總共花費 16 天。
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 public class Main { static int n;//作物總類數 static int m;//初始擁有作物種類數 static int k;//方案數 static int t;//目標作物編號 static int total_time = 0;//總時長 static int[] time;//作物成熟時間 static int[][] task;//方案 static int[] flag;//得到的種子作物種類情況 static void dfs(int t){ for (int i = 0; i < k; i++) { if(task[i][2]==t){ if(flag[task[i][0]]!=1||flag[task[i][1]]!=1){ total_time += Math.max(time[task[i][0]],time[task[i][1]]); //System.out.println(i); if(flag[task[i][0]]!=1){ dfs(task[i][0]); } if(flag[task[i][1]]!=1){ dfs(task[i][1]); } flag[t]=1; } } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); k = sc.nextInt(); t = sc.nextInt(); time = new int[n+1]; task = new int[k][3]; flag = new int[n+1]; int p; for (int i = 1; i <= n; i++) { time[i] = sc.nextInt() - 1; } for (int i = 1; i < m+1; i++) { p = sc.nextInt(); /*flag[p] = 1;*/ } for(int i = 0;i < k; i++){ for(int j = 0;j < 3;j++){ task[i][j] = sc.nextInt(); } } flag[t] = 1; dfs(t); System.out.println(total_time); } }View Code
21.子串分值
題目描述
對於一個字串 SS,我們定義 SS 的分值 f(S)f(S) 為 SS 中恰好出現一次的字元個數。例如 f(aba) = 1,f(abc) = 3, f(aaa) = 0f(aba)=1,f(abc)=3,f(aaa)=0。
現在給定一個字串 S_{0 \cdots n − 1}S0⋯n−1(長度為 nn,1 \leq n \leq 10^51≤n≤105),請你計算對於所有 SS 的非空子串 S_{i \cdots j}(0 ≤ i ≤ j < n)Si⋯j(0≤i≤j<n),f(S_{i \cdots j})f(Si⋯j) 的和是多少。
輸入描述
輸入一行包含一個由小寫字母組成的字串 SS。
輸出描述
輸出一個整數表示答案。
輸入輸出樣例
示例
輸入
ababc
輸出
21
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 /** 可以用一個迴圈把字串都遍歷完, 我們只需要將每一個元素含有多少個符合包含該元素且只出現一次的子串, 然後將所有元素的符合子串個數相加,就可以了。 推出公式為(i - left)(right - i) left和right分別是左右碰到a或者結束的時候的下標 */ public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String str = scan.next(); //字串的長度 int len = str.length(); //定義左遊標 右遊標 和 字串分值總和變數 int left,right,sum = 0; for(int i = 0; i < len; i++) { for(right = i + 1; right < len; right++) { //如果此時遇到了相同的字元 停止 if(str.charAt(right) == str.charAt(i)) { break; } } for(left = i - 1; left >= 0; left--) { if(str.charAt(left) == str.charAt(i)) { break; } } sum += (i - left) * (right - i); } System.out.println(sum); scan.close(); } }View Code
22.數列求和
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
給定數列 1, 1, 1, 3, 5, 9, 17, \cdots1,1,1,3,5,9,17,⋯,從第 44 項開始,每項都是前 33 項的和。
求第 2019032420190324 項的最後 44 位數字。
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; /** * 20190324 這個數過於龐大 無論是遞迴還是迭代 程式都無法正常執行, 而且int 、 long、BigDecimal等都無法、承載這麼大的數 * 題目要求我們只取最後四位 , 那我們可以對每次運算出來的結果 %10000 這樣每次結果就都保留最後四位數字 */ public class Main { public static void main(String[] args) { int a = 1,b = 1,c = 1,d = 0; for(int i = 4;i<=20190324;i++){ d = (a+b+c)%10000; a = b; b = c; c = d; } System.out.println(d); } }View Code
23.棋盤放麥子
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
你一定聽說過這個故事。國王對發明國際象棋的大臣很佩服,問他要什麼報酬,大臣說:請在第 11 個棋盤格放 11 粒麥子,在第 22 個棋盤格放 22 粒麥子,在第 33 個棋盤格放 44 粒麥子,在第 44 個棋盤格放 88 粒麥子,......後一格的數字是前一格的兩倍,直到放完所有棋盤格(國際象棋共有 6464 格)。
國王以為他只是想要一袋麥子而已,哈哈大笑。
當時的條件下無法準確計算,但估算結果令人吃驚:即使全世界都鋪滿麥子也不夠用!
請你藉助計算機準確地計算,到底需要多少粒麥子。
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; import java.math.BigInteger; /* 前言 在Java中,由CPU原生提供的整型最大範圍是64位 long 型整數。使用 long 型整數可以直接通過CPU指令進行計算,速度非常快。 但是如果我們使用的整數範圍超過了 long 型怎麼辦?這個時候,就只能用軟體來模擬一個大整數。 java.math.BigInteger 就是用來表示任意大小的整數。 BigInteger 內部用一個 int[] 陣列來模擬一個非常大的整數。 常用的兩種定義方式 BigInteger a=new BigInteger("123"); //沒有引數為long的建構函式,用字串來構造 BigInteger b=BigInteger.valueOf(123); //靜態方法,返回val對應的BigInteger BigInteger類中定義了四則運算的方法,add,subtract,multiply,divide。對 BigInteger 做運算的時候,只能使用例項方法。 如: a=a.add(b); */ public class Main { public static void main(String[] args) { // TODO Auto-generated method stub BigInteger sum = BigInteger.valueOf(1); BigInteger add = BigInteger.valueOf(1); BigInteger mul = BigInteger.valueOf(2); for (int i=0;i<63;i++) { add = add.multiply(mul); sum = sum.add(add); } System.out.println(sum); } }View Code
24.七段碼
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
小藍要用七段碼數碼管來表示一種特殊的文字。
上圖給出了七段碼數碼管的一個圖示,數碼管中一共有 77 段可以發光的二 極管,分別標記為 a, b, c, d, e, f, ga,b,c,d,e,f,g。
小藍要選擇一部分二極體(至少要有一個)發光來表達字元。在設計字元 的表達時,要求所有發光的二極體是連成一片的。
例如:bb 發光,其他二極體不發光可以用來表達一種字元。
例如 cc 發光,其他二極體不發光可以用來表達一種字元。這種方案與上 一行的方案可以用來表示不同的字元,儘管看上去比較相似。
例如:a, b, c, d, ea,b,c,d,e 發光,f, gf,g 不發光可以用來表達一種字元。
例如:b, fb,f 發光,其他二極體不發光則不能用來表達一種字元,因為發光 的二極體沒有連成一片。
請問,小藍可以用七段碼數碼管表達多少種不同的字元?
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { static int N = 100000 * 4 + 5; static int M = 1000 + 5; static int mod = 1000000009; static Scanner cin = new Scanner(System.in); static int ans = 0, n, m; static ArrayList<Integer> g[] = new ArrayList[N]; //建圖 第i個數組的元素都跟i相連 static boolean vis[] = new boolean[N]; //判斷當前這條線段是否被遞迴過 static boolean dp[] = new boolean[N]; //二進位制判重 static int a[] = new int[1<<8]; public static void main(String[] args) { for(int i = 1; i <= 7; i++) g[i] = new ArrayList<Integer>(); //這裡就是賦予數字意義 重新連邊 add(1, 2); add(1, 6); add(2, 7); add(2, 3); add(3, 4); add(4, 5); add(5, 6); add(5, 7); add(6, 7); add(3, 7); for(int i = 1; i <= 7; i++) { vis[i] = true; //這裡列舉是保證至少有一條燈管是亮著的 dfs(i , 1); vis[i] = false; } System.out.println(ans); } private static void dfs(int u, int k) { a[k] = u; //遞迴的第k條線段是數字編號為u的線段 check(k); //對每個狀態都判重 //這裡從1列舉到k就是列舉當前聯通塊相連的邊 for(int i = 1; i <= k; i++) { for(int v: g[a[i]]) { if(vis[v]) continue; vis[v] = true; dfs(v, k + 1); vis[v] = false; } } } private static void check(int k) { int res = 0; for(int i = 1; i <= k; i++) //因為每個線段的數字不同 代表的二進位制數字也就不同 res += (1<<a[i]); if(dp[res]) return; dp[res] = true; ans++; } private static void add(int i, int j) { g[i].add(j); g[j].add(i); } }View Code
參考
https://blog.csdn.net/jianghxin/article/details/109134914
25.年號字串
題目描述
本題為填空題,只需要算出結果後,在程式碼中使用輸出語句將所填結果輸出即可。
小明用字母 AA 對應數字 11,BB 對應 22,以此類推,用 ZZ 對應 2626。對於 2727 以上的數字,小明用兩位或更長位的字串來對應,例如 AAAA 對應 2727,ABAB 對應 2828,AZAZ 對應 5252,LQLQ 對應 329329。
請問 20192019 對應的字串是什麼?
執行限制
- 最大執行時間:1s
- 最大執行記憶體: 128M
程式碼
import java.util.Scanner; // 1:無需package // 2: 類名必須Main, 不可修改 /* 這一題使用StringBuilder用來儲存轉換後的字元,因為StringBuilder可以用來存放可變字元。 直接迴圈,知道n的值小於或者等於0 每次迴圈都-1是因為這個數是從1開始計算的,但是計算機是從0開始計算的,所以每一次都得-1, 因為n/26的值也是從1開始的。 後面就是使用append()方法把值強制轉換成char型別存放到我們建立的物件裡面 最後使用reverse()函式讓字元顛倒,然後toString()方法輸出 */ public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此輸入您的程式碼... int n = 2019; StringBuilder sb = new StringBuilder(); while(n>0){ n --; sb.append((char)(n%26+'A')); n /= 26; } System.out.println(sb.reverse().toString()); } }View Code