目錄
大家好,我是愛做夢的魚,我是一個大三的小菜雞,非常向往優秀,羨慕優秀的人,已拿兩個暑假offer,現在衝刺秋招,歡迎大家找我進行交流😂😂😂
這是我的博客地址:子浩的博客https://blog.csdn.net/weixin_43124279
本文轉載自南牆
試題 A: 跑步訓練
本題總分:5 分
【問題描述】
小明要做一個跑步訓練。
初始時,小明充滿體力,體力值計爲 10000。如果小明跑步,每分鐘損耗
600 的體力。如果小明休息,每分鐘增加 300 的體力。體力的損耗和增加都是
均勻變化的。
小明打算跑一分鐘、休息一分鐘、再跑一分鐘、再休息一分鐘……如此循
環。如果某個時刻小明的體力到達 0,他就停止鍛鍊。
請問小明在多久後停止鍛鍊。爲了使答案爲整數,請以秒爲單位輸出答案。
答案中只填寫數,不填寫單位。
【答案提交】
這是一道結果填空題,你只需要算出結果後提交即可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
package 第十一屆藍橋杯;
public class C跑步訓練 {
public static void main(String[] args) {
int target = 10000;
int count = 0;
boolean flag = true;
while (true) {
//如果小於600體力並且需要跑步,證明這一分鐘跑不完
if (target < 600 && flag){
break;
}
if (flag) {
target -= 600;
flag = false;
} else {
target += 300;
flag = true;
}
count++;
}
// System.out.println(count);
//最後要求秒數,一分鐘花費600體力,一秒花費10體力,體力除10就是剩下的跑步時間
int time = count * 60+target/10;
System.out.println(time);
}
}
試題 B: 紀念日
本題總分:5 分
【問題描述】
2020 年 7 月 1 日是A組織 成立 99 週年紀念日。
A組織成立於 1921 年 7 月 23 日。
請問從 1921 年 7 月 23 日中午 12 時到 2020 年 7 月 1 日中午 12 時一共包
含多少分鐘?
【答案提交】
這是一道結果填空題,你只需要算出結果後提交即可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
package 第十一屆藍橋杯B;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class B紀念日 {
//不需要非要找12點,因爲都是從0點算也是一樣的
public static void main(String[] args) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = format.parse("1921-7-23");
Date date2 = format.parse("2020-7-1");
int a = (int) ((date2.getTime() - date1.getTime()) / (1000*60));
System.out.println(a);
}
}
試題 C: 合併檢測
本題總分:10 分
【問題描述】
***(敏感字)由 ***(敏感字)引起,最近在 A 國蔓延,爲了儘快控制 ***(敏感字),A 國準備給大量民衆進病毒核酸檢測。然而,用於檢測的試劑盒緊缺。爲了解決這一困難,科學家想了一個辦法:合併檢測。即將從多個人(k個)採集的標本放到同一個試劑盒中進行檢測。如果結果爲陰性,則說明這 k個人都是陰性,用一個試劑盒完成了 k 個人的檢測。如果結果爲陽性,則說明至少有一個人爲陽性,需要將這 k 個人的樣本全部重新獨立檢測(從理論上看,如果檢測前 k 1 個人都是陰性可以推斷出第 k 個人是陽性,但是在實際操作中不會利用此推斷,而是將 k 個人獨立檢測),加上最開始的合併檢測,一共使用了 k + 1 個試劑盒完成了 k 個人的檢測。A 國估計被測的民衆的感染率大概是 1%,呈均勻分佈。請問 k 取多少能最節省試劑盒?
【答案提交】
這是一道結果填空題,你只需要算出結果後提交即可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
試題 D: REPEAT 程序
本題總分:10 分
【問題描述】
附件 prog.txt 中是一個用某種語言寫的程序。
其中 REPEAT k 表示一個次數爲 k 的循環。循環控制的範圍由縮進表達,
從次行開始連續的縮進比該行多的(前面的空白更長的)爲循環包含的內容。
例如如下片段:
REPEAT 2:
A = A + 4
REPEAT 5:
REPEAT 6:
A = A + 5
A = A + 7
A = A + 8
A = A + 9
該片段中從 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的
循環兩次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循環中。
A = A + 5 實際總共的循環次數是 2
×
5
×
6 = 60 次。
請問該程序執行完畢之後,A 的值是多少?
【答案提交】
這是一道結果填空題,你只需要算出結果後提交即可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
package 第十一屆藍橋杯;
public class E_REPEAT程序 {
public static void main(String[] args) {
int A=0;
for (int i=0;i<2;i++){
A+=4;
for (int j=0;j<5;j++){
for (int k=0;k<6;k++){
A+=5;
}
A+=7;
}
A+=8;
}
A+=9;
System.out.println(A);
}
}
試題 E: 矩陣
本題總分:15 分
【問題描述】
把 1 ∼ 2020 放在 2 × 1010 的矩陣裏。要求同一行中右邊的比左邊大,同一
列中下邊的比上邊的大。一共有多少種方案?
答案很大,你只需要給出方案數除以 2020 的餘數即可。
【答案提交】
這是一道結果填空題,你只需要算出結果後提交即可。本題的結果爲一個
整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
package 第十一屆藍橋杯B;
public class E矩陣1 {
public static void main(String[] args) {
int n = 2020;
//dp[i][j]表示,從i個數選j個數
int[][] dp = new int[3000][3000];
dp[1][1] = 1; // 1必然放在第一行
//只要保證第一行的數比第二行的數多就可以了,後面的數會越來越大,會符合小到大的規律
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j] += dp[i - 1][j - 1]; // 放到第一層
if (i - j <= j) {
//當進入if說明,i沒有超過j的兩倍了,
// (如果超過j的兩倍,說明第一行肯定比第二行少了)
//本身就是取一半的數字,如果超過兩倍,說明取不到一半,不能參與計算
dp[i][j] += dp[i - 1][j]; //放到第二層
}
dp[i][j] %= 2020;
}
}
System.out.println(dp[n][n/2]);
}
}
試題 F: 整除序列
時間限制: 1.0s 內存限制: 256.0MB 本題總分:15 分
【問題描述】
有一個序列,序列的第一個數是 n,後面的每個數是前一個數整除 2,請輸
出這個序列中值爲正數的項。
【輸入格式】
輸入一行包含一個整數 n。
【輸出格式】
輸出一行,包含多個整數,相鄰的整數之間用一個空格分隔,表示答案。
【樣例輸入】
20
【樣例輸出】
20 10 5 2 1
【評測用例規模與約定】
對於 80% 的評測用例,1 ≤ n ≤ 10^9。
對於所有評測用例,1 ≤ n≤ 10^18。
package 第十一屆藍橋杯;
import java.util.Scanner;
public class G整除序列 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
while (n != 0) {
System.out.print(n + " ");
n = n >> 1;//等價於/2,位運算相對快一些
}
}
}
試題 G: 解碼
時間限制: 1.0s 內存限制: 256.0MB 本題總分:20 分
【問題描述】
小明有一串很長的英文字母,可能包含大寫和小寫。
在這串字母中,有很多連續的是重複的。小明想了一個辦法將這串字母表
達得更短:將連續的幾個相同字母寫成字母 + 出現次數的形式。
例如,連續的 5 個 a,即 aaaaa,小明可以簡寫成 a5(也可能簡寫成 a4a、
aa3a 等)。對於這個例子:HHHellllloo,小明可以簡寫成 H3el5o2。爲了方便表
達,小明不會將連續的超過 9 個相同的字符寫成簡寫的形式。
現在給出簡寫後的字符串,請幫助小明還原成原來的串。
【輸入格式】
輸入一行包含一個字符串。
【輸出格式】
輸出一個字符串,表示還原後的串。
【樣例輸入】
H3el5o2
【樣例輸出】
HHHellllloo
【評測用例規模與約定】
對於所有評測用例,字符串由大小寫英文字母和數字組成,長度不超過
100。
請注意原來的串長度可能超過 100。
package 第十一屆藍橋杯B;
import java.util.Scanner;
public class G解碼 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
sc.close();
StringBuilder sb = new StringBuilder();
char[] num = s.toCharArray();
char temp='0';
int count=0;
int len = s.length();
for (int i=0;i<len;i++){
if(Character.isDigit(num[i])){
count=num[i]-'0';
for (int j=0;j<count;j++){
sb.append(temp);
}
} else{
temp=num[i];
if(i<len-1 && Character.isDigit(num[i+1])){
continue;
} else {
sb.append(temp);
}
}
}
System.out.println(sb.toString());
}
}
試題 H: 走方格
時間限制: 1.0s 內存限制: 256.0MB 本題總分:20 分
【問題描述】
在平面上有一些二維的點陣。
這些點的編號就像二維數組的編號一樣,從上到下依次爲第 1 至第 n 行,
從左到右依次爲第 1 至第 m 列,每一個點可以用行號和列號來表示。
現在有個人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下
走。
注意,如果行號和列數都是偶數,不能走入這一格中。
問有多少種方案。
【輸入格式】
輸入一行包含兩個整數 n, m。
【輸出格式】
輸出一個整數,表示答案。
【樣例輸入】
3 4
【樣例輸出】
2
【樣例輸入】
6 6
【樣例輸出】
0
【評測用例規模與約定】
對於所有評測用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
package 第十一屆藍橋杯;
import java.util.Scanner;
public class H走方格 {
public static void main(String[] args) {
//輸入矩陣的寬高
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
sc.close();
int[][] dp = new int[n][m];
dp[0][0]=1;
//這個規律是隻能往右下走,也就是隻能取左上的值
for (int i=0;i<n;i++){
for(int j=0;j<m;j++){
//第一行一列無需處理
if(i==0 && j==0){
continue;
}
//只要不是第一行就可以取上面的
if(i>0){
dp[i][j]+=dp[i-1][j];
}
//只要不是第一列就可以取左面的
if(j>0){
dp[i][j]+=dp[i][j-1];
}
//如果是偶數行列不能取值,這裏是奇數,因爲我的是從0開始,所以偶數的就變成了奇數
if((i&1)==1 && (j&1)==1){
dp[i][j]=0;
}
}
}
System.out.println(dp[n-1][m-1]);
}
}
試題 I: 整數拼接
時間限制: 1.0s 內存限制: 256.0MB 本題總分:25 分
【問題描述】
給定義個長度爲 n 的數組 A1, A2, · · · , An。你可以從中選出兩個數 Ai 和 A**j
(i 不等於 j),然後將 Ai 和 Aj 一前一後拼成一個新的整數。例如 12 和 345 可
以拼成 12345 或 34512。注意交換 Ai 和 Aj 的順序總是被視爲 2 種拼法,即便
是 Ai = Aj 時。
請你計算有多少種拼法滿足拼出的整數是 K 的倍數。
【輸入格式】
第一行包含 2 個整數 n 和 K。
第二行包含 n 個整數 A1, A2, · · · , A**n。
【輸出格式】
一個整數代表答案。
【樣例輸入】
4 2
1 2 3 4
【樣例輸出】
6
【評測用例規模與約定】
對於 30% 的評測用例,1 ≤ n≤ 1000, 1 ≤ K ≤ 20, 1 ≤ Ai ≤ 10^4。
對於所有評測用例,1 ≤ n≤ 10^5,1 ≤ K≤ 105,1 ≤ Ai ≤ 10^9。
package 第十一屆藍橋杯B;
import java.util.Scanner;
public class I整數拼接1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] num = new int[n];
int[][] a = new int[k][10];
int[][] b = new int[k][10];
//int aa=1111111111;
int temp=0;
//記錄有哪些數自己和自己拼接可以爲k倍
int subtract=0;
for (int i=0;i<n;i++){
num[i]=sc.nextInt();
//取餘
temp=num[i]%k;
//餘數爲temp的,並且位數爲當前數字相同的
++b[temp][getLen(num[i])];
//求這個數*這個數的位數
for (int j =1;j<=9;j++){
//a[i][j]代表%k餘數爲i的,後面帶10的j次方(因爲後面的數不知道幾位,所以要把1-9位都算一下)
++a[((temp*((int) (Math.pow(10,j))%k))%k)][j];
}
//如果自身可以拼接,就紀錄一下,最後減去自身拼接的數
if(temp+(temp*(getLen(num[i])%k))%k==k){
subtract++;
}
}
int count=0;
for (int i=0;i<k;i++){
for (int j =1;j<=9;j++){
//(餘數爲i的並且要加上位數爲j的數字)的數量*(餘數爲(k-i)%k並且數字爲j位數的)得數量就是組合拼接的數量
count+=a[i][j]*b[(k-i)%k][j];
}
}
System.out.println(count-subtract);
}
//求num有幾位
public static int getLen(int num){
int len=1;
while (num!=0){
num/=10;
len*=10;
}
return len/10;
}
}
試題 J: 網絡分析
時間限制: 1.0s 內存限制: 256.0MB 本題總分:25 分
【問題描述】
小明正在做一個網絡實驗。
他設置了 n 臺電腦,稱爲節點,用於收發和存儲數據。
初始時,所有節點都是獨立的,不存在任何連接。
小明可以通過網線將兩個節點連接起來,連接後兩個節點就可以互相通信
了。兩個節點如果存在網線連接,稱爲相鄰。
小明有時會測試當時的網絡,他會在某個節點發送一條信息,信息會發送
到每個相鄰的節點,之後這些節點又會轉發到自己相鄰的節點,直到所有直接
或間接相鄰的節點都收到了信息。所有發送和接收的節點都會將信息存儲下來。
一條信息只存儲一次。
給出小明連接和測試的過程,請計算出每個節點存儲信息的大小。
【輸入格式】
輸入的第一行包含兩個整數 n, m,分別表示節點數量和操作數量。節點從
1 至 n 編號。
接下來 m 行,每行三個整數,表示一個操作。
如果操作爲 1 a b,表示將節點 a 和節點 b 通過網線連接起來。當 a = b
時,表示連接了一個自環,對網絡沒有實質影響。
如果操作爲 2 p t,表示在節點 p 上發送一條大小爲 t 的信息。
【輸出格式】
輸出一行,包含 n 個整數,相鄰整數之間用一個空格分割,依次表示進行
完上述操作後節點 1 至節點 n 上存儲信息的大小。
試題J: 網絡分析 12第十一屆藍橋杯大賽軟件類省賽 C/C++ 大學 B 組
【樣例輸入】
4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1
【樣例輸出】
13 13 5 3
【評測用例規模與約定】
對於 30% 的評測用例,1 ≤ n ≤ 20,1 ≤ m ≤ 100。
對於 50% 的評測用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000。
對於 70% 的評測用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000。
對於所有評測用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000,1 ≤ t ≤ 100。
package 第十一屆藍橋杯B;
import java.util.LinkedList;
import java.util.Scanner;
public class J網絡分析1 {
static int[] data ;
static boolean[] bool ;
static LinkedList<LinkedList<Integer>> list = new LinkedList<LinkedList<Integer>>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
data=new int[n+1];
bool=new boolean[n+1];
int a=0,b=0,c=0;
for (int i =0;i<=n;i++){
list.add(new LinkedList<>());
}
for (int i=0;i<m;i++){
a=sc.nextInt();
b=sc.nextInt();
c=sc.nextInt();
//網絡題把他們互相聯繫起來
if(a==1){
list.get(b).add(c);
list.get(c).add(b);
} else{
bool=new boolean[n+1];
dfs(b,c);
}
}
for (int i=1;i<=n;i++){
System.out.println(data[i]);
}
}
//dfs遍歷每一個結點
public static void dfs(int node,int num){
bool[node]=true;
data[node]+=num;
LinkedList<Integer> templist=list.get(node);
for(int i:templist){
if(!bool[i]){
dfs(i,num);
}
}
}
}