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列的畫素都是海洋。
【輸出格式】
一個整數表示答案。
【輸入樣例】
7
.......
.##....
.##....
....##.
..####.
...###.
.......
【輸出樣例】
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,否則按無效程式碼處理。
沒做出來。