2020第十一屆藍橋杯第二場JavaB組


第一題:門牌制作(624)

題目大意:

  • 判斷1到2020里面共有多少個‘2’;

解析:

  • 本題簡而言之就是找‘2’這一個數
  • 第一種方法:遍歷將其轉換為字符然后再遍歷尋找
  • 第二種方法:直接用數值的方法進行計算

以下為運行成功的代碼 :

/*
 * 第一題:判斷1到2020里面共有多少個‘2’
 * @又又
 */

/*
 * 第一種方法:先將其轉換為字符,然后再遍歷尋找
 * 第二種:直接用數值的方法進行計算
 */
//public class test01 {
//
//	public static void main(String[] args) {
//		// TODO Auto-generated method stub
//
//		int ans=0;
//		char ch[] = null;
//		for (int i = 1; i <=2020; i++) {
//			ch=Integer.toString(i).toCharArray();
//			for (int j = 0; j < ch.length; j++) {
//				if(ch[j]=='2')
//					ans++;
//			}
//		}
//		System.out.println(ans);
//	}
//
//}


public class test01{
	public static void main(String[] args) {
		int ans=0;
		for (int i = 1,n=1; i <=2020;n=++i) {
			do {
				if(n%10==2)
					ans++;
			}
			while((n/=10)>0);
		}
		System.out.println(ans);
	}
}

第二題:尋找2020(16520)

題目大意:

  • 簡而言之即:在一個數字矩陣里面找2020,同一行從左到右,同一列從上到下,斜線上左上到右下構成

解析:

  • 在輸入數據的時候可以采用原始的方式從鍵盤輸入,或者熟悉輸入流導入
  • 層層暴力遍歷尋找滿足條件的數,感覺暴力出奇跡哈哈哈

以下是運行成功的代碼:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/*
 * 尋找2020,在一個數字矩陣里找2020,同一行從左到右,同一列
 * 從上到下,斜線上左上到右下構成
 * @又又
 */
import java.util.Scanner;

public class test02{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);//采用的直接從鍵盤輸入方式
        int[][] num = new int[305][305];
        for (int i=1;i<=300;i++) {
            String str = in.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);

    }
}

第三題:蛇形填數(761)

題目大意:

  • 根據以下的圖形以及數值,我們可以知道第二行第二列的數值為5,現在求第20行第20列的數值為多少?
 /*
 * 蛇形填數:
 * 1  2  6  7  15 ...
 * 3  5  8  14 ...
 * 4  9  13 ...
 * 10 12 ...
 * 11 ...
 * ...
 * 
 * @ac
 */

解析:

找規律:
 
 行列(a)    第i行第i列的那個數值前面有幾條斜線(b)     所在位置的數值(c)
 
 
 a        b          c
 1        1          1 
 2        2          5
 3        4          13
 4        6          25 
 5        8          41
 6        10         61
 ...      ...        ...
 20      20*2-2      20*38+1=761
 
 解析:
 發現a與b的關系為a*2-2=b
 從2開始這三者的關系為:a*b+1=c

第六題:成績分析

題目大意

/*
 * 成績分析:
 * 求最高分、最低分、平均分
 * 
 * 輸入格式:
 * 第一行一個整數n,表示考試人數
 * 接下里n行,每行包含一個0到100的整數,表示一個學生的得分
 * 
 * 輸出格式:
 * 輸出三行
 * 第一行一個整數表示最高分
 * 第二行一個整數表示最低分
 * 第三行一個實數、四舍五入保留正好兩位小數,表示平均分
 */

以下為運行成功的代碼:

import java.util.Arrays;
import java.util.Scanner;

/*
 * 成績分析:
 * 求最高分、最低分、平均分
 * 
 * 輸入格式:
 * 第一行一個整數n,表示考試人數
 * 接下里n行,每行包含一個0到100的整數,表示一個學生的得分
 * 
 * 輸出格式:
 * 輸出三行
 * 第一行一個整數表示最高分
 * 第二行一個整數表示最低分
 * 第三行一個實數、四舍五入保留正好兩位小數,表示平均分
 */
public class test06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner (System.in);
		int n=in.nextInt();int a;
		int max=Integer.MIN_VALUE,min=Integer.MAX_VALUE;
		double sum=0;
		for (int i = 0; i < n; i++) {
			a=in.nextInt();
			sum+=a;
			if(a>max)
				max=a;
			if(min>a)
				min=a;
		}
		
		System.out.println(max);
		System.out.println(min);
		System.out.println(String.format("%.2f",sum/n));
	}

}

第七題:單詞分析

題目大意:

  • 輸入一行字母,然后從中找出出現次數最多的字母,以及他出現的次數,如果有多個次數相同的字母,則按照字典序輸出
  • 輸出格式:第一行輸出字母,第二行輸出次數

解析:

  • 1.因為題目已經要求了全部是小寫字母的輸入,所以我們就不需要考慮大小寫字母的轉換問題了
  • 2.第一步,因為要確定字母出現的次數,先將輸入的一行字母轉換為字符數組
ch=str.toCharArray();
  • 3.第二步,遍歷統計次數,字符-'a'
  • 4.第三步,判斷最大次數以及轉換為字符輸出

以下為運行成功的代碼:

import java.util.Scanner;

/*
 * 單詞分析:
 * 在輸入到 一行單詞中,找出出現次數最多的字母是哪一個,如果有多個一樣的,則輸出字典序最小的那一個
 * 第一行輸出字母
 * 第二行輸出次數
 * 
 * @又又
 */
public class test07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner (System.in);
		String str=in.nextLine();
		char ch[]=new char[26];
		int ans[]=new int[26];
		ch=str.toCharArray();
		/*
		 * 統計字母出現次數
		 * a:97
		 */
		for (int i = 0; i < ch.length; i++) {
			ans[ch[i]-'a']++;
		}
		char zimu = 0;
		int max=Integer.MIN_VALUE;
		for (int i = 0; i < ans.length; i++) {
			if(max<ans[i])
			{
				max=ans[i];//最大次數
				zimu=(char)(i+'a');//轉換為字符/字母
			}
		}
		System.out.println(zimu+"\n"+max);
	}

}

第八題:數字三角形

題目大意:


從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和。路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過 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

解析:

  • 1.此題跟數字保齡球的思想大致一樣,直接dp數組一套操作下來差不多,但是這里需要注意的是,此題要求了向左走和向右走的次數相差不能超過1.
  • 2.其實好像沒分清這個寫法是不是經典dp哈哈哈哈,那就當作暴力解法,畢竟暴力出奇跡
  • 3.在遞歸選擇向左走和向右走以至於達到最大和的時候,還應判斷二者次數的相差值,所以直接可以將這四者(向左,向右,向左走的次數,向右走的次數)函數遞歸;
  • 4.在每次的函數遞歸的時候,先判斷上次二者的次數相差值;

突然想起在比賽的時候好像最后真就直接rua的dp,兀突突

以下為運行成功的代碼:

import java.util.Scanner;

/*
 * 數字三角形
 * @又又⭐
 */
public class test08 {
	static int max=Integer.MIN_VALUE;
	static Scanner in =new Scanner (System.in);
	static int n=in.nextInt();
	static int ans[][]=new int [n][n];
	
	public static int bl(int ans[][],int i,int j,int left,int right)
	{
		if(i==ans.length-1)
		{
			if(Math.abs(left-right)>1)
				return 0;
		}
		if(i<ans.length)
		{
			return ans[i][j]+Math.max(bl(ans, i+1,j+1,left,right+1),bl(ans,i+1,j,left+1,right));
		}
		return 0;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		for (int i = 0; i < n; i++) {
			for (int j = 0; j <=i; j++) {
				ans[i][j]=in.nextInt();
			}
		}
		System.out.println(bl(ans,0,0,0,0));
	}

}

第九題:子串分值和

題目大意:

時間限制: 1.0s 內存限制: 512.0MB 本題總分:25 分
對於一個字符串 S,我們定義 S 的分值 f(S ) 為 S 中出現的不同的字符個數。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。現在給定一個字符串 S [0…n n 1](長度為 n),請你計算對於所有 S 的非空
子串 S [i… j](0 ≤ i ≤ j < n),f(S [i… j]) 的和是多少。
輸入格式:
輸入一行包含一個由小寫字母組成的字符串 S。
輸出格式:
輸出一個整數表示答案。
樣例輸入:
ababc
樣例輸出:
28

評測用例規模與約定:
對於 20% 的評測用例,1 ≤ n ≤ 10;
對於 40% 的評測用例,1 ≤ n ≤ 100;
對於 50% 的評測用例,1 ≤ n ≤ 1000;
對於 60% 的評測用例,1 ≤ n ≤ 10000;
對於所有評測用例,1 ≤ n ≤ 100000。

樣例解析:

解析:

  • 1.題目的大概意思即划分出子串,然后在子串中找出出現的不同字母的個數,然后將其相加即可得出答案;
  • 2.既然要求包含不同字母,可以想到用set集合,每個字母的出現只會算作一次;
  • 3.用兩個for循環(前提需要判斷時間復雜度是否滿足題目要求),在第二個循環中依次將其add進set中,然后相加set.size()次數;

以下是運行成功的代碼:

import java.util.HashSet;
import java.util.Scanner;

/*
 * 子串分值和
 */
public class test09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		String str=in.nextLine();
		char ch[]=str.toCharArray();
		long ans=0;
		for (int i = 0; i < ch.length; i++) {
			HashSet<Character> set=new HashSet<Character>();
			for (int j = i; j < ch.length; j++) {
				set.add(ch[j]);
				ans+=set.size();
			}
		}
		System.out.println(ans);
	}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM