2019第十屆藍橋杯Java題


A.組隊

  • 題目描述:

作為籃球隊教練,你需要從以下名單中選出 1 號位至 5 號位各一名球員, 組成球隊的首發陣容。
每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位至 5 號位的評分之和最大可能是多少?

【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。

  • (1).由題意可得,這一號到五號,不會存在與同一行,所以我們直接可找出每一列的最大兩個數,然后進行選擇相加得值
  • (2).或者將數據存入二維數組,for循環加判斷。

B.不同子串

  • 題目描述:

一個字符串的非空子串是指字符串中長度至少為 1 的連續的一段字符組成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 個。 注意在計算時,只算本質不同的串的個數。
請問,字符串0100110001010001 有多少個不同的非空子串?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。

  • (1).題目中提到了不同的子串,所以我們可以選擇用集合,將滿足要求的組合放入集合中,最后.size()得到個數;
  • (2).用雙重循環遍歷,然后獲取子字符串;其中用到string中的substring(i,j);
第二題:不同字串(集合)
public class 第十屆藍橋杯 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		
		HashSet<String>set=new HashSet<String>();
		
		String sc=in.nextLine();
		for(int i=0;i<sc.length();i++)
		{
			for(int j=i+1;j<=sc.length();j++)
			{
				set.add(sc.substring(i,j));
			}
		}
		System.out.println(set.size());//100
		
	}

}

C.數列求值

題目描述:
給定數列 1, 1, 1, 3, 5, 9, 17, …,從第 4 項開始,每項都是前 3 項的和。求 第 20190324 項的最后 4 位數字。
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個 4 位整數(提示:答案的千位不為 0),在提交答案時只填寫這個整數,填寫 多余的內容將無法得分。

  • 第一眼:乍一看,每項都是前幾項得和,我們可能會很快想到好像斐波那契數列,但是,這里求得是20190324項得最后四位數字
  • 發現只是求最后4位數字,這也就變相得說明了它所受到的影響只來自於相加數的末四位,所以我們可以邊遍歷到20190324,邊加邊只保留后四位,同時也不會溢出
//第三題:數列求值
public class 第十屆藍橋杯 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int i=1,j=1,k=1;
		int sum=0;
		for(int a=4;a<=20190324;a++)
		{
			sum=(i+j+k)%10000;i=j;j=k;;k=sum;
		}
		System.out.println(sum);//4659
	}
}

D.數的分解

題目描述:

把 2019 分解成 3 個各不相同的正整數之和,並且要求每個正整數都不包 含數字 2 和 4,一共有多少種不同的分解方法? 注意交換 3 個整數的順序被視為同一種方法,例如 1000+1001+18 和 1001+1000+18 被視為同一種。
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。

  • (1).第一想到的是三重循環,在每一重里面都進行一個判斷(是否包含數字2和4),最后一重判斷相加是否等於2019;
  • (2).題目中提到各不相同,排列組合公式共六種(ABC,ACB,BAC,BCA,CAB,CBA),同時交換順序視為一種,所以最后有也就剩ABC這一種排列方式,令j=i+1,k=j+1,可減少次數;
第四題:數的分解
public class 第十屆藍橋杯 {
	
	public static boolean fenjie(int a)
	{
		while(a>0)
		{
			if(a%10==2||a%10==4) {
				return true;
			}a/=10;
			
		}
		return false;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int ans=0;
		for(int i=1;i<2019;i++)
		{
			if(fenjie(i)) 
				continue;
			for(int j=i+1;j<2019;j++)
			{
				if(fenjie(j)) 
					continue;
				for(int k=j+1;k<2019;k++)
				{
					if(fenjie(k)) 
						continue;
					if(i+j+k==2019) {
						ans++;
					}
				}
			}
		}
		System.out.println(ans);//40785
	}
}

第二種方法(字符串查找)

  • (3).后面想到可以用字符串查找的方式做
public class 第十屆藍橋杯 {
	public static void main(String[] args) {
		
		int num = 0;
		for (int i = 1; i < 2019; i++) {
			if ((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1)
				continue;
			for (int j = i + 1; j < 2019; j++) {
				if ((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1)
					continue;
				for(int k=j+1;k<2019;k++)
				{
					if ((k+ "").indexOf("2") != -1 || (k + "").indexOf("4") != -1) {
						continue;
					}
					if(i+j+k==2019)
						num++;
				}
			}
		}
	System.out.println(num);//40785
	}
}

F.特別的數

時間限制: 1.0s 內存限制: 512.0MB 本題總分:15 分
【問題描述】
小明對數位中含有 2、0、1、9 的數字很感興趣(不包括前導 0),在 1 到 40 中這樣的數包括 1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。 請問,在 1 到 n 中,所有這樣的數的和是多少?
【輸入格式】
輸入一行包含兩個整數 n。
【輸出格式】
輸出一行,包含一個整數,表示滿足條件的數的和。
【樣例輸入】 40
【樣例輸出】 574
【評測用例規模與約定】 對於 20% 的評測用例,1≤n≤10。 對於 50% 的評測用例,1≤n≤100。 對於 80% 的評測用例,1≤n≤1000。 對於所有評測用例,1≤n≤10000。

  • (1).將int轉換為String,用String.indexof()判斷;
  • (2).使用while循環加%和/進心計算判斷
第六題:特別數的和
public class 第十屆藍橋杯 {

	public static void main(String[] args) {
		Scanner in=new Scanner (System.in);
		int n=in.nextInt();int ans=0;
		for(int i=1;i<=n;i++)
		{
			int a=i;
			while(a>0)
			{
				if(a%10==2||a%10==0||a%10==1||a%10==9) {
					ans+=i;break;
				}
				a/=10;
			}
		}
		System.out.println(ans);//樣例40,輸出574
	}
}

特別的數第二種方法(.indexOf())

第六題:特別數的(字符解決方法)
public class 第十屆藍橋杯 {

	public static void main(String[] args) {
		//先將1-n的數字轉換為string,用string中的indexof();
		Scanner in=new Scanner (System.in);
		int n=in.nextInt();
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			String ss=Integer.toString(i);
			if(ss.indexOf("2")!=-1||ss.indexOf("0")!=-1||ss.indexOf("1")!=-1||ss.indexOf("9")!=-1)
			{
				ans+=i;
			}
		}
		System.out.println(ans);//樣例40,輸出574
	}
}

G.外賣優先級

題目描述:
時間限制: 1.0s 內存限制: 512.0MB 本題總分:20 分
“飽了么”外賣系統中維護着 N 家外賣店,編號 1 ∼ N。每家外賣店都有 一個優先級,初始時 (0 時刻) 優先級都為 0。 每經過 1 個時間單位,如果外賣店沒有訂單,則優先級會減少 1,最低減 到 0;而如果外賣店有訂單,則優先級不減反加,每有一單優先級加 2。 如果某家外賣店某時刻優先級大於 5,則會被系統加入優先緩存中;如果 優先級小於等於 3,則會被清除出優先緩存。 給定 T 時刻以內的 M 條訂單信息,請你計算 T 時刻時有多少外賣店在優 先緩存中。
【輸入格式】 第一行包含 3 個整數 N、M 和 T。 以下 M 行每行包含兩個整數 ts 和 id,表示 ts 時刻編號 id 的外賣店收到 一個訂單。
【輸出格式】
輸出一個整數代表答案。
【樣例輸入】 2 6 6 1 1 5 2 3 1 6 2 2 1 6 2

【樣例輸出】 1
【樣例解釋】 6 時刻時,1 號店優先級降到 3,被移除出優先緩存;2 號店優先級升到 6, 加入優先緩存。所以是有 1 家店 (2 號) 在優先緩存中。
【評測用例規模與約定】 對於 80% 的評測用例,1≤ N,M,T ≤10000。 對於所有評測用例,1≤ N,M,T ≤100000,1≤ts≤T,1≤id ≤ N

  • (1).對數據進行處理:設置一個二維數組a[i][j],i表示店鋪的編號,j表示某時刻。

  • (2).循環輸入ts,id,相對應a[id][ts]++,表示此時刻有訂單;設置一個表示優先緩存店鋪數組ans[i],通過對ans[i]的不同操作引起值的變化

  • (2).1.當a[i][j]==1的時候,則對其ans[i]+=a[i][j]*2;否則ans[i]=Math.max(0,ans[i]-1)
//第五題:外賣優先級
public class 第十屆藍橋杯 {

	public static void main(String[] args) {
		Scanner in=new Scanner (System.in);
		int N=in.nextInt();int M=in.nextInt();int T=in.nextInt();
		int [][]a=new int[N+1][M+1];
		int []ans=new int[N+1];
		HashMap<Integer,Integer> map=new HashMap<>();
		//第一步:先進行數據的輸入,對輸入的數據進行處理
		for(int i=0;i<M;i++)
		{
			int ts=in.nextInt();//時刻
			int id=in.nextInt();//店鋪編號
			if(ts<T)
				a[id][ts]++;
		}
		for(int i=0;i<N;i++)
		{
			for(int j=0;j<T;j++)
			{
				if(a[i][j]==1)
					ans[i]+=a[i][j]*2;
				else ans[i]=Math.max(0, ans[i]-1);
				if(ans[i]>5)
					map.put(i,1);
				if(ans[i]<=3)
					map.remove(i);
			}
		}
		System.out.println(map.size());
	}
}

I.卡在思考第三種情況,后面想通了補

J.這題有點不會,也后面再補


免責聲明!

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



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