1. 程式人生 > >2018年第九屆藍橋杯Java b組總結

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,
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,否則按無效程式碼處理。
觀察後不難發現,可以看成每一步走一個折線,奇數步左上(x-n,y)(x-n,y+n),偶數步右下(x+n,y)(x+n,y-n),n為步數,在走的過程中判斷最後加一個統計變數即可
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
/
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,否則按無效程式碼處理。

估計涉及到動態規劃,沒什麼思路。
後續繼續跟新!