2018年第九屆藍橋杯Java b組總結
public class Main{ public void static main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int tlength = 0; int[] tuple = new int[n*3]; int[] temp = new int[n*3]; int[] count = {0}; //記錄有多設個滿足條件的三元組 //根據輸入構造ABC ... //構造一個下標陣列{0,0,0,1,1,1,2,2,2,...,n-1,n-1,n-1} for(int i = 0; i<n; i++){ for(int j = 0; j<3; j++){ tuple[count++] = i; } } printSet(A,B,C,tuple,temp,count,0,n*3); } //增量法列舉長度為3的子列並判斷條件 public static void printSet(int[]a, int[]b, int[]c, int[]tuple,int[]temp,int[]count,int cur, int n){ if(cur>3) return; if(cur==3){ if(a[tuple[[temp[0]]]<b[tuple[[temp[1]]]&&b[tuple[[temp[1]]]<c[tuple[temp[2]]]) count[0]++; } int s = cur!=0?temp[cur-1]+1:0; for(int i = s; s<n; i++){ temp[cur] = i; printSet(a,b,c,tuple,temp,count,cur+1,n); } } }
時間複雜度:O(nlogn)
悲劇的是debug好久答案不正確,經驗不足,時間比較緊張,導致後面幾道題時間不夠。
第七題:螺旋折線
如圖所示的螺旋折線經過平面上所有整點恰好一次。 對於整點(X, Y),我們定義它到原點的距離dis(X,觀察後不難發現,可以看成每一步走一個折線,奇數步左上(x-n,y)(x-n,y+n),偶數步右下(x+n,y)(x+n,y-n),n為步數,在走的過程中判斷最後加一個統計變數即可
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; public class T7 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); int y = sc.nextInt(); boolean ok = false; int x1 = 0, y1 = 0,m=0,count=0; while(!ok){ if(x1==x&&y1==y){ ok = true; break; } m++; if(m%2==1){//奇數步 for(int i = 0; i<m; i++){ if(x1==x&&y1==y){ ok = true; break; } x1-=1; count++; } for(int i = 0;i<m;i++){ if(x1==x&&y1==y){ ok = true; break; } y1+=1; count++; } }else if(m%2==0){//偶數步 for(int i = 0; i<m; i++){ if(x1==x&&y1==y){ ok = true; break; } x1+=1; count++; } for(int i = 0;i<m;i++){ if(x1==x&&y1==y){ ok = true; break; } y1-=1; count++; } } } System.out.println(count); } }
第八題:日誌統計
小明維護著一個程式設計師論壇。現在他收集了一份"點贊"日誌,日誌共有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,否則按無效程式碼處理。
也不難,獲取日誌陣列,構造HashMap統計最後判斷滿足k輸出即可.
這裡程式碼不在貼出。
第九題:全球變暖
你有一張某海域NxN畫素的照片,"."表示海洋、"#"表示陸地,如下所示:....... .##.... .##.... ....##. ..####. ...###. .......
其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。
由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),它就會被淹沒。
例如上圖中的海域未來會變成如下樣子:
....... ....... ....... ....... ....#.. ....... .......
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。
【輸入格式】 第一行包含一個整數N。 (1 <= N <= 1000) 以下N行N列代表一張海域照片。
照片保證第1行、第1列、第N行、第N列的畫素都是海洋。
【輸出格式】 一個整數表示答案。
【輸入樣例】 7
.......
.##....
.##....
....##.
..####.
...###.
.......【輸出樣例】 1
資源約定: 峰值記憶體消耗(含虛擬機器) < 256M CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。 不要使用package語句。不要使用jdk1.7及以上版本的特性。
主類的名字必須是:Main,否則按無效程式碼處理。
不太會,主要基礎不好,是一個圖問題,對圖不太熟悉,dfs演算法不會寫,算是基本功不行
第十題:堆的記數
我們知道包含N個元素的堆可以看成是一棵包含N個節點的完全二叉樹。
每個節點有一個權值。對於小根堆來說,父節點的權值一定小於其子節點的權值。假設N個節點的權值分別是1~N,你能求出一共有多少種不同的小根堆嗎?
例如對於N=4有如下3種:
1
/ \
2 3
/
41
/ \
3 2
/
41
/ \
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,否則按無效程式碼處理。
估計涉及到動態規劃,沒什麼思路。
後續繼續跟新!