1. 程式人生 > >2018 藍橋杯Java B組試題及答案

2018 藍橋杯Java B組試題及答案

這是我考試做的答案,未必正確,僅限參考。



1:第幾天
2000年的1月1日,是那一年的第1天。
那麼,2000年的5月4日,是那一年的第幾天?

注意:需要提交的是一個整數,不要填寫任何多餘內容。

用excel算,答案125.

2.

標題:方格計數
如圖p1.png所示,在二維平面上有無數個1x1的小方格。

我們以某個小方格的一個頂點為圓心畫一個半徑為1000的圓。
你能計算出這個圓裡有多少個完整的小方格嗎? 

注意:需要提交的是一個整數,不要填寫任何多餘內容。

這題我錯了

3.

標題:複數冪
設i為虛數單位。對於任意正整數n,(2+3i)^n 的實部和虛部都是整數。
求 (2+3i)^123456 等於多少? 即(2+3i)的123456次冪,這個數字很大,要求精確表示。
答案寫成 "實部±虛部i" 的形式,實部和虛部都是整數(不能用科學計數法表示),中間任何地方都不加空格,實部為正時前面不加正號。(2+3i)^2 寫成: -5+12i,
(2+3i)^5 的寫成: 122-597i
注意:需要提交的是一個很龐大的複數,不要填寫任何多餘內容。

import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;

class Main
{
	public static void main(String args[]) throws IOException
	{
		BigInteger a=new BigInteger("2"),b=new BigInteger("3"),c=new BigInteger("1"),d=new BigInteger("0"),t;
	
			FileWriter file=new FileWriter("ans.txt");
		
		for(int i=0;i<123456;i++)
		{
			t=c;
			c=a.multiply(c).add(b.multiply(d));
			d=a.multiply(d).add(b.multiply(t));
		}
		file.write(c+"+"+d+"i");
                file.close();
	}
}

4.

標題:測試次數
x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。
各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出一個耐摔指數來,之後才允許上市流通。
x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當於我們的2樓。
如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7。
特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0。
如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n
為了減少測試次數,從每個廠家抽樣3部手機參加測試。
某次測試的塔高為1000層,如果我們總是採用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢?
請填寫這個最多測試次數。
注意:需要填寫的是一個整數,不要填寫任何多餘內容。

我寫的10,但我感覺未必二分法這麼簡單。

5.

標題:快速排序

以下程式碼可以從陣列a[]中找出第k小的元素。  
它使用了類似快速排序中的分治演算法,期望時間複雜度是O(N)的。
請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。
import java.util.Random;
public class Main{
public static int quickSelect(int a[], int l, int r, int k) {
Random rand = new Random();
int p = rand.nextInt(r - l + 1) + l;
int x = a[p];
int tmp = a[p]; a[p] = a[r]; a[r] = tmp;
int i = l, j = r;
while(i < j) {
                while(i < j && a[i] < x) i++;
                if(i < j) {
                        a[j] = a[i];
                        j--;
                }
                while(i < j && a[j] > x) j--;
                if(i < j) {
                        a[i] = a[j];
                        i++;
                }
        }
        a[i] = x;
        p = i;
        if(i - l + 1 == k) return a[i];
        if(i - l + 1 < k) return quickSelect( _________________________________ ); //填空
        else return quickSelect(a, l, i - 1, k);
}
public static void main(String args[]) {
int [] a = {1, 4, 2, 8, 5, 7};
System.out.println(quickSelect(a, 0, 5, 4));
}
}


注意:只提交劃線部分缺少的程式碼,不要抄寫任何已經存在的程式碼或符號。

答案 a,i+1,r,k-(i-l+1)

6.

標題:遞增三元組
給定三個整數陣列
A = [A1, A2, ... AN], 
B = [B1, B2, ... BN], 
C = [C1, C2, ... CN],
請你統計有多少個三元組(i, j, k) 滿足:
1. 1 <= i, j, k <= N  
2. Ai < Bj < Ck  
【輸入格式】
第一行包含一個整數N。
第二行包含N個整數A1, A2, ... AN。
第三行包含N個整數B1, B2, ... BN。
第四行包含N個整數C1, C2, ... CN。
對於30%的資料,1 <= N <= 100  
對於60%的資料,1 <= N <= 1000 
對於100%的資料,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000 
【輸出格式】
一個整數表示答案
【輸入樣例】
3
1 1 1
2 2 2
3 3 3


【輸出樣例】
27 
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms




請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效程式碼處理。


import java.util.Scanner;

class Main
{
	public static void main(String args[])
	{
		int n;
		int a[],b[],c[],d[],e[];
		long ans=0;
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		a=new int[n];
		b=new int[n];
		c=new int[n];
		d=new int[n];
		e=new int[n];
		for(int i=0;i<n;i++)
			a[i]=sc.nextInt();
		for(int i=0;i<n;i++)
			b[i]=sc.nextInt();
		for(int i=0;i<n;i++)
			c[i]=sc.nextInt();
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				if(a[i]<b[j]) 
				{
					d[i]=j+1;break;
				}
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				if(b[i]<c[j]) 
				{
					e[i]=j+1;break;
				}
		for(int i=0;i<n;i++)
			if(d[i]!=0)
			for(int j=d[i]-1;j<n;j++)
				if(e[j]!=0)
				ans+=n-e[j]+1;
		System.out.println(ans);      
	}
}

7.



標題:螺旋折線

如圖p1.pgn所示的螺旋折線經過平面上所有整點恰好一次。

  

對於整點(X, Y),我們定義它到原點的距離dis(X, Y)是從原點到(X, Y)的螺旋折線段的長度。  
例如dis(0, 1)=3, dis(-2, -1)=9  
給出整點座標(X, Y),你能計算出dis(X, Y)嗎?
【輸入格式】
X和Y 
對於40%的資料,-1000 <= X, Y <= 1000  
對於70%的資料,-100000 <= X, Y <= 100000  
對於100%的資料, -1000000000 <= X, Y <= 1000000000  
【輸出格式】
輸出dis(X, Y)  


【輸入樣例】
0 1
【輸出樣例】
3
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效程式碼處理。


import java.util.Scanner;

class Main
{
	public static void main(String args[])
	{
		int a,b,p,q;
		long ans=0;
		Scanner sc=new Scanner(System.in);
		a=sc.nextInt();
		b=sc.nextInt();
		if(Math.abs(a)>Math.abs(b))
		{
			p=a;q=1;
		}
		else {
			p=b;q=2;
		}
		ans=4*Math.abs(p)*(Math.abs(p)-1);
		if(q==1&&a<0)
			ans+=b-a;
		else if(q==1&&a>=0)
			ans+=5*a-b;
		else if(q==2&&b<0)
			ans=-7*b-a;
		else ans+=3*b+a;
		System.out.println(ans);
	}
}

8.

標題:日誌統計
小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是:
ts id  
表示在ts時刻編號id的帖子收到一個"贊"。  
現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就認為這個帖子曾是"熱帖"。  
具體來說,如果存在某個時刻T滿足該帖在[T, T+D)這段時間內(注意是左閉右開區間)收到不少於K個贊,該帖就曾是"熱帖"。  
給定日誌,請你幫助小明統計出所有曾是"熱帖"的帖子編號。  
【輸入格式】
第一行包含三個整數N、D和K。  
以下N行每行一條日誌,包含兩個整數ts和id。  


對於50%的資料,1 <= K <= N <= 1000  
對於100%的資料,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000  


【輸出格式】
按從小到大的順序輸出熱帖id。每個id一行。  


【輸入樣例】
7 10 2  
0 1  
0 10    
10 10  
10 1  
9 1
100 3  
100 3  
【輸出樣例】
1  
3  

資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。

主類的名字必須是:Main,否則按無效程式碼處理。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Main
{
	public static void main(String args[])
	{
		int n,d,k;
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		d=sc.nextInt();
		k=sc.nextInt();
		Node arr[]=new Node[n];
		for(int i=0;i<n;i++)
			arr[i]=new Node(sc.nextInt(),sc.nextInt());
		Arrays.sort(arr);
		int curid=arr[0].id;
		int added=0;
		for(int i=0;i<n;i++)
		{			
			if(i+k-1<n&&arr[i+k-1].id==curid&&arr[i+k-1].ts-arr[i].ts<d&&added==0)
				{System.out.println(curid);added=1;}
			else if(arr[i].id!=curid)
			{
				curid=arr[i].id;
				added=0;
				i=i-1;
			}
		}
	
	}
}
class Node implements Comparable<Node>
{
	int ts,id;
	Node(int a,int b)
	{
		ts=a;
		id=b;
	}
	
	@Override
	public int compareTo(Node o) {
		if(id==o.id)
			return ts-o.ts;
		else
			return id-o.id;
	}
	
}

9.

標題:全球變暖


你有一張某海域NxN畫素的照片,"."表示海洋、"#"表示陸地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
....... 

其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。  


由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),它就會被淹沒。  


例如上圖中的海域未來會變成如下樣子:


.......
.......
.......
.......
....#..
.......
.......


請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。  


【輸入格式】
第一行包含一個整數N。  (1 <= N <= 1000)  
以下N行N列代表一張海域照片。  


照片保證第1行、第1列、第N行、第N列的畫素都是海洋。  


【輸出格式】
一個整數表示答案。


【輸入樣例】

.......
.##....
.##....
....##.
..####.
...###.
.......  

【輸出樣例】
1  
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效程式碼處理。

import java.util.Scanner;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

class Main
{
	static int n,map[][],vis[][];
	static boolean dfs(int i,int j)
	{
		if(i<0||i>=n||j<0||j>=n||vis[i][j]==1) return false;
		vis[i][j]=1;
		boolean f=false;
		if(map[i][j+1]==1&&map[i][j-1]==1&&map[i-1][j]==1&&map[i+1][j]==1)
			f=true;
		return dfs(i, j+1)||dfs(i, j-1)||dfs(i+1, j)||dfs(i-1, j)||f;
	}
	public static void main(String args[])
	{
    int r=0,t=0;
	Scanner sc=new Scanner(System.in);
	n=sc.nextInt();
	map=new int[n][n];
	vis=new int[n][n];
	for(int i=0;i<n;i++)
	{
		String s=sc.next();
		for(int j=0;j<n;j++)
			if(s.charAt(j)!='.')
				map[i][j]=1;
			else 
				vis[i][j]=1;	
	}
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			if(vis[i][j]!=1)
			{
				
				r++;
				t+=dfs(i, j)?1:0;
			
			}
		
	System.out.println(r-t);
	}
}

10.



標題:堆的計數


我們知道包含N個元素的堆可以看成是一棵包含N個節點的完全二叉樹。  
每個節點有一個權值。對於小根堆來說,父節點的權值一定小於其子節點的權值。  


假設N個節點的權值分別是1~N,你能求出一共有多少種不同的小根堆嗎?  


例如對於N=4有如下3種:


    1
   / \
  2   3
 /
4


    1
   / \
  3   2
 /
4


    1
   / \
  2   4
 /
3


由於數量可能超過整型範圍,你只需要輸出結果除以1000000009的餘數。  




【輸入格式】
一個整數N。  
對於40%的資料,1 <= N <= 1000  
對於70%的資料,1 <= N <= 10000  
對於100%的資料,1 <= N <= 100000


【輸出格式】
一個整數表示答案。  


【輸入樣例】
4  


【輸出樣例】
3




資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗  < 1000ms




請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。


所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
不要使用package語句。不要使用jdk1.7及以上版本的特性。

主類的名字必須是:Main,否則按無效程式碼處理。

沒做出來。