1. 程式人生 > >第八屆藍橋杯Java A組決賽試題

第八屆藍橋杯Java A組決賽試題

1.標題:圖書排列

將編號為1~10的10本書排放在書架上,要求編號相鄰的書不能放在相鄰的位置。
請計算一共有多少種不同的排列方案。


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

答案:479306

思路:全排或者DFS

import java.util.*;
public class Main {
    static int res=0;
    public static boolean check(int a[])
    {
        int l=a.length;
        for(int i=0;i<l-1;i++)
        {
            if(Math.abs(a[i]-a[i+1])==1)
            {
                return false;
            }
        }
        return true;
    }
    public static void swap(int a[],int x,int y)
    {
        int temp =a[x];
        a[x]=a[y];
        a[y]=temp;
    }
    public static void sort(int a[],int begin,int end)
    {
        if(begin==end)
        {
            if(check(a))
            res++;
        }

        for(int i=begin;i<=end;i++)
        {
            swap(a,begin,i);
            sort(a,begin+1,end);
            swap(a,begin,i);
        }
    }
    public static void main(String[] args) {

        int a[]={1,2,3,4,5,6,7,8,9,10};
        sort(a,0,a.length-1);
        System.out.println(res);
    }

}
2.標題:磁磚樣式


小明家的一面裝飾牆原來是 3*10 的小方格。
現在手頭有一批剛好能蓋住2個小方格的長方形瓷磚。
瓷磚只有兩種顏色:黃色和橙色。


小明想知道,對於這麼簡陋的原料,可以貼出多少種不同的花樣來。
小明有個小小的強迫症:忍受不了任何2*2的小格子是同一種顏色。
(瓷磚不能切割,不能重疊,也不能只鋪一部分。另外,只考慮組合圖案,請忽略瓷磚的拼縫)
顯然,對於 2*3 個小格子來說,口算都可以知道:一共10種貼法,如【p1.png所示】


但對於 3*10 的格子呢?肯定是個不小的數目,請你利用計算機的威力算出該數字。


注意:你需要提交的是一個整數,不要填寫任何多餘的內容(比如:說明性文字)

答案:105760

import java.util.*;
public class Main {

    public static void main(String[] args) {
        int [] [] d =new int[3][l];
        run(d,0,0);
        System.out.println(sum);
    }
    static int sum =0;//計數器
    static int l =10;//l是10

    public static void p(int [][] d){//驗證p
        for(int i=0;i<3;i++){
            for(int j=0;j<l;j++){
                System.out.print(d[i][j]);
            }
            System.out.println();
        }

    }

    public static boolean cc( int [][] d, int x,int y){
        if(x>=1&&d[x][y]==d[x-1][y]){
            if(y>=1&&d[x][y-1]==d[x][y]&&d[x-1][y-1]==d[x][y]){
                return false;
            }
            if(y<l-1&&d[x][y+1]==d[x][y]&&d[x-1][y+1]==d[x][y]){
                return false;
            }
        }
        if(x<2&&d[x][y]==d[x+1][y]){
            if(y>=1&&d[x][y-1]==d[x][y]&&d[x+1][y-1]==d[x][y]){
                return false;
            }
            if(y<l-1&&d[x][y+1]==d[x][y]&&d[x+1][y+1]==d[x][y]){
                return false;
            }
        }
        return true;
    }

    public static void run(int [][] d, int x,int y){

        while(y>l-1||d[x][y]!=0){
            //y已經超出邊界了  因為+1、2了
            //我就需要換行處理
            if(y<l&&d[x][y]!=0){
                y++;
                continue;
            }
            x=x+1;
            y=0;
            if(x>2){
                sum ++;
//              p(d); //取消檢視正確輸出
//              System.out.println();//換行
                return;
            }
            while(d[x][y]!=0){
                y++;
                if(y>l-1){
                    break;
                }
            }
        }



        //豎著放一個11 或者22
        if(x<2){
            //11填充
            d[x][y]=1;
            d[x+1][y]=1;
            if(cc(d,x,y)&&cc(d,x+1,y)){
                //都能裝的時候
                //指標右移
                run(d,x,y+1);
            }

            //22填充
            d[x][y]=2;
            d[x+1][y]=2;
            if(cc(d,x,y)&&cc(d,x+1,y)){
                //都能裝的時候
                //指標右移
                run(d,x,y+1);
            }
            //回溯
            d[x][y]=0;
            d[x+1][y]=0;

        }
        //橫著放一個11或者22
        if(y<l-1&&d[x][y+1]==0){
            //11填充
            d[x][y]=1;
            d[x][y+1]=1;

            if(cc(d,x,y)&&cc(d,x,y+1)){
                //都能裝的時候
                //指標右移
                run(d,x,y+2);
            }
            //22填充
            d[x][y]=2;
            d[x][y+1]=2;
            if(cc(d,x,y)&&cc(d,x,y+1)){
                //都能裝的時候
                //指標右移
                run(d,x,y+2);
            }
            //回溯
            d[x][y]=0;
            d[x][y+1]=0;
        }
    }

}


3.標題:希爾伯特曲線


希爾伯特曲線是以下一系列分形曲線 Hn 的極限。我們可以把 Hn 看作一條覆蓋 2^n × 2^n 方格矩陣的曲線,曲線上一共有 2^n × 2^n 個頂點(包括左下角起點和右下角終點),恰好覆蓋每個方格一次。


[p1.png]


Hn(n > 1)可以通過如下方法構造:
1. 將 Hn-1 順時針旋轉90度放在左下角
2. 將 Hn-1 逆時針旋轉90度放在右下角
3. 將2個 Hn-1 分別放在左上角和右上角
4. 用3條單位線段把4部分連線起來


對於 Hn 上每一個頂點 p ,我們定義 p 的座標是它覆蓋的小方格在矩陣中的座標(左下角是(1, 1),右上角是(2^n, 2^n),從左到右是X軸正方向,從下到上是Y軸正方向),
定義 p 的序號是它在曲線上從起點開始數第幾個頂點(從1開始計數)。


以下程式對於給定的n(n <= 30)和p點座標(x, y),輸出p點的序號。請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。

import java.util.Scanner;
	
public class HilbertCurve {
    public static long f(int n, int x, int y) {
	if (n == 0) return 1;
        int m = 1 << (n - 1);
        if (x <= m && y <= m) {
                return f(n - 1, y, x);
        }
        if (x > m && y <= m) {
                return 3L * m * m + f(n - 1, ________________ , m * 2 - x + 1); //填空
        }
        if (x <= m && y > m) {
                return 1L * m * m + f(n - 1, x, y - m);
        }
        if (x > m && y > m) {
                return 2L * m * m + f(n - 1, x - m, y - m);
        }
		return -1;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
      	int n = in.nextInt();
		int x = in.nextInt();
		int y = in.nextInt();
        
        System.out.println(f(n, x, y));
    }
}

注意:只填寫劃線處缺少的內容,不要填寫已有的程式碼或符號,也不要填寫任何解釋說明文字等。

答案:m-y+1

思路:找規律,填空處是右下角區域,以4*4->2*2為例,m=2

          (3,1)->(2,2)  (3,2)->(1,2)  (4,1)->(2,1)  (4,2)->(1,1)

          顯然x=m-y+1,y=m*2-x+1

4.標題:發現環


小明的實驗室有N臺電腦,編號1~N。原本這N臺電腦之間有N-1條資料鏈接相連,恰好構成一個樹形網路。在樹形網路上,任意兩臺電腦之間有唯一的路徑相連。


不過在最近一次維護網路時,管理員誤操作使得某兩臺電腦之間增加了一條資料鏈接,於是網路中出現了環路。環路上的電腦由於兩兩之間不再是隻有一條路徑,使得這些電腦上的資料傳輸出現了BUG。


為了恢復正常傳輸。小明需要找到所有在環路上的電腦,你能幫助他嗎?


輸入
-----
第一行包含一個整數N。
以下N行每行兩個整數a和b,表示a和b之間有一條資料鏈接相連。


對於30%的資料,1 <= N <= 1000
對於100%的資料, 1 <= N <= 100000, 1 <= a, b <= N


輸入保證合法。


輸出
----
按從小到大的順序輸出在環路上的電腦的編號,中間由一個空格分隔。




樣例輸入:
5
1 2
3 1
2 4
2 5
5 3


樣例輸出:
1 2 3 5


資源約定:
峰值記憶體消耗 < 256M
CPU消耗  < 1000ms




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


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

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

思路:用floyd變形算下傳遞關係,對角線為1的都是在環上的

import java.util.*;
public class Main {
    static int n;
    static int map[][];
    public static void floyd()
    {

        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    if(map[i][k]==1 && map[k][j]==1)
                    {
                        map[i][j]=1;
                    }
                }

    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n=in.nextInt();
        map=new int[n+1][n+1];
        for(int i=0;i<n;i++)
        {
            int x=in.nextInt();
            int y=in.nextInt();
            map[x][y]=1;
        }

        floyd();

        for(int i=1;i<=n;i++)
        {
            if(map[i][i]==1)
            {
                System.out.print(i+" ");
            }
        }

    }
}
5.標題:對局匹配


小明喜歡在一個圍棋網站上找別人線上對弈。這個網站上所有註冊使用者都有一個積分,代表他的圍棋水平。


小明發現網站的自動對局系統在匹配對手時,只會將積分差恰好是K的兩名使用者匹配在一起。如果兩人分差小於或大於K,系統都不會將他們匹配。


現在小明知道這個網站總共有N名使用者,以及他們的積分分別是A1, A2, ... AN。


小明想了解最多可能有多少名使用者同時線上尋找對手,但是系統卻一場對局都匹配不起來(任意兩名使用者積分差不等於K)?  


輸入
----
第一行包含兩個個整數N和K。
第二行包含N個整數A1, A2, ... AN。  


對於30%的資料,1 <= N <= 10
對於100%的資料,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000


輸出
----
一個整數,代表答案。


樣例輸入:
10 0
1 4 2 8 5 7 1 4 2 8


樣例輸出:
6


資源約定:
峰值記憶體消耗 < 256M
CPU消耗  < 1000ms


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


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

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

思路:暴力法,估計會超時,僅供參考

import java.util.*;
public class Main {
    static int n,k;
    static int a[];
    static boolean vis[];
    static int count=0;
    public static void check(int index,int step)
    {
        if(index==n+1)
        {
            return;
        }

        if(count<step)
        {
            count=step;
        }

        for(int i=index;i<n;i++)
        {
                boolean flag=true;
                for(int j=0;j<n;j++)
                {
                    if(vis[j] && Math.abs(a[i]-a[j])==k)
                    {
                        flag=false;
                        break;
                    }
                }
                if(flag)
                {
                    vis[i]=true;
                    check(i+1,step+1);
                    vis[i]=false;
                }
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n=in.nextInt();
        k=in.nextInt();
        a=new int[n];

        for(int i=0;i<n;i++)
        {
            a[i]=in.nextInt();
        }

        for(int i=0;i<n;i++) {
            vis=new boolean[n];
            check(i, 0);
        }

        System.out.println(count);
    }
}
6.標題:觀光鐵路


跳蚤國正在大力發展旅遊業,每個城市都被打造成了旅遊景點。
許多跳蚤想去其他城市旅遊,但是由於跳得比較慢,它們的願望難以實現。這時,小C聽說有一種叫做火車的交通工具,在鐵路上跑得很快,便抓住了商機,創立了一家鐵路公司,向跳蚤國王請示在每兩個城市之間都修建鐵路。
然而,由於小C不會扳道岔,火車到一個城市以後只能保證不原路返回,而會隨機等概率地駛向與這個城市有鐵路連線的另外一個城市。
跳蚤國王向廣大居民徵求意見,結果跳蚤們不太滿意,因為這樣修建鐵路以後有可能只遊覽了3個城市(含出發的城市)以後就回來了,它們希望能多遊覽幾個城市。於是跳蚤國王要求小C提供一個方案,使得每隻跳蚤坐上火車後能多遊覽幾個城市才回來。


小C提供了一種方案給跳蚤國王。跳蚤國王想知道這個方案中每個城市的居民旅遊的期望時間(設火車經過每段鐵路的時間都為1),請你來幫跳蚤國王。


【輸入格式】
輸入的第一行包含兩個正整數n、m,其中n表示城市的數量,m表示方案中的鐵路條數。
接下來m行,每行包含兩個正整數u、v,表示方案中城市u和城市v之間有一條鐵路。
保證方案中無重邊無自環,每兩個城市之間都能經過鐵路直接或間接到達,且火車由任意一條鐵路到任意一個城市以後一定有路可走。


【輸出格式】
輸出n行,第i行包含一個實數ti,表示方案中城市i的居民旅遊的期望時間。你應當輸出足夠多的小數位數,以保證輸出的值和真實值之間的絕對或相對誤差不超過1e-9。


【樣例輸入】
4 5
1 2
2 3
3 4
4 1
1 3


【樣例輸出】
3.333333333333
5.000000000000
3.333333333333
5.000000000000


【樣例輸入】
10 15
1 2
1 9
1 5
2 3
2 7
3 4
3 10
4 5
4 8
5 6
6 7
6 10
7 8
8 9
9 10


【樣例輸出】
10.000000000000
10.000000000000
10.000000000000
10.000000000000
10.000000000000
10.000000000000
10.000000000000
10.000000000000
10.000000000000
10.000000000000


【資料規模與約定】
對於10%的測試點,n <= 10;
對於20%的測試點,n <= 12;
對於50%的測試點,n <= 16;
對於70%的測試點,n <= 19;
對於100%的測試點,4 <= k <= n <= 21,1 <= u, v <= n。資料有梯度。




資源約定:
峰值記憶體消耗 < 256M
CPU消耗  < 2000ms




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


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

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

思路:沒看懂題目。。求解釋期望時間

相關推薦

藍橋Java A決賽試題

1.標題:圖書排列將編號為1~10的10本書排放在書架上,要求編號相鄰的書不能放在相鄰的位置。請計算一共有多少種不同的排列方案。注意,需要提交的是一個整數,不要填寫任何多餘的內容。答案:479306思路:全排或者DFSimport java.util.*; public cl

藍橋Java C決賽試題

1.標題:數位和數學家高斯很小的時候就天分過人。一次老師指定的算數題目是:1+2+...+100。高斯立即做出答案:5050!這次你的任務是類似的。但並非是把一個個的數字加起來,而是對該數字的每一個數位作累加。這樣從1加到100的“和”是:901從10加到15是:21,也就是

藍橋Java C決賽試題

1.平方末尾能夠表示為某個整數的平方的數字稱為“平方數”比如,25,64雖然無法立即說出某個數是平方數,但經常可以斷定某個數不是平方數。因為平方數的末位只可能是:[0, 1, 4, 5, 6, 9] 這6個數字中的某個。所以,4325435332必然不是平方數。如果給你一個2

藍橋Java B決賽試題

1.憤怒小鳥X星球憤怒的小鳥喜歡撞火車!一根平直的鐵軌上兩火車間相距 1000 米兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。憤怒的小鳥從A車出發,時速50米/秒,撞向B車,然後返回去撞A車,再返回去撞B車,如此往復....兩火車在相距1米處停車。問:這期間憤怒的

藍橋JAVA B【省賽】

一.標題: 購物單小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定。現在小明很心煩

藍橋 java B 日期問題

標題:日期問題 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有采用年/月/日的,有采用月/日/年的, 還有采用日/月/年的。更加麻煩的是,年份也都

藍橋Java/A 五題

題目:廣場舞 LQ市的市民廣場是一個多邊形,廣場上鋪滿了大理石的地板磚。 地板磚鋪得方方正正,就像座標軸紙一樣。 以某四塊磚相接的點為原點,地板磚的兩條邊為兩個正方向,一塊磚的邊長為橫縱座標的單位長度,則所有橫縱座標都為整數的點都是四塊磚的交點(如果在廣場內)。 廣場的

藍橋C++A 迷宮

標題:迷宮X星球的一處迷宮遊樂場建在某個小山坡上。它是由10x10相互連通的小房間組成的。房間的地板上寫著一個很大的字母。我們假設玩家是面朝上坡的方向站立,則:L表示走到左邊的房間,R表示走到右邊的房間,U表示走到上坡方向的房間,D表示走到下坡方向的房間。X星球的居民有點懶,

藍橋JAVA B省賽題解

第一題 標題: 購物單 小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。 這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。 小明也有個怪癖,不到萬不得已,從不刷卡,直接

2017年藍橋 C++A國賽 第二題 生命遊戲 題解

生命遊戲 康威生命遊戲是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。 這個遊戲在一個無限大的2D網格上進行。 初始時,每個小方格中居住著一個活著或死了的細胞。 下一時刻每個細胞的狀態都由它周圍八個格子的細胞狀態決定。 具體來說:

2017藍橋Java B省賽第一題:購物單

第一題 標題: 購物單 小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。 這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。 小明也有個怪癖,不到萬不得已,從不刷卡,直接現金搞定

藍橋-藍橋java B決賽

一、憤怒小鳥 X星球憤怒的小鳥喜歡撞火車!  一根平直的鐵軌上兩火車間相距 1000 米 兩火車 (不妨稱A和B) 以時速 10米/秒 相對行駛。 憤怒的小鳥從A車出發,時速50米/秒,撞向B車, 然後返回去撞A車,再返回去撞B車,如此往復.... 兩火車在相距1米處停車。

藍橋java b三題

watermark alt args 暴力破解 out col HR sdn oid 第三題 三羊獻瑞 觀察下面的加法算式: 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。 請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多余內容。 答案這個題目

藍橋java b第一題

都是 text nbsp post ppa hbm 藍橋杯 文字 fill 第一題 三角形面積 圖中的所有小方格面積都是1。 那麽,圖中的三角形面積應該是多少呢? 請填寫三角形的面積。不要填寫任何多余內容或說明性文字。 填空答案 28 沒什麽好說的 第一題很水 估計

藍橋java b8題

CP stat exti 要求 得到 嚴格 else scan 內容 樂羊羊飲料廠正在舉辦一次促銷優惠活動。樂羊羊C型飲料,憑3個瓶蓋可以再換一瓶C型飲料,並且可以一直循環下去,但不允許賒賬。 請你計算一下,如果小明不浪費瓶蓋,盡量地參加活動,那麽,對於他初始買入的n瓶飲料

2017藍橋Java省賽

第一題:購物單 小明剛剛找到工作,老闆人很好,只是老闆夫人很愛購物。老闆忙的時候經常讓小明幫忙到商場代為購物。小明很厭煩,但又不好推辭。 這不,XX大促銷又來了!老闆夫人開出了長長的購物單,都是有打折優惠的。  小明也有個怪癖,不到萬不得已,從不刷卡,直

2017藍橋Java省賽有感

  相對於ACM程式設計大賽的難度,藍橋杯就算容易一些了,第八屆的難度比前兩屆也提高了不少,建議在HDOJ上多加練習,這樣就能輕鬆些。   從準備上講藍橋杯有很多題都有固定的套路,大量練習是必不可少的,校內選拔之後,就開始不斷的刷題總結的無限迴圈中。   臨

藍橋JAVA B省賽-四平方和試題

四平方和 四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 +

藍橋C++A 顛倒的價牌

標題:顛倒的價牌小李的店裡專賣其它店中下架的樣品電視機,可稱為:樣品電視專賣店。其標價都是4位數字(即千元不等)。小李為了標價清晰、方便,使用了預製的類似數碼管的標價籤,只要用顏色筆塗數字就可以了(參見p1.jpg)。這種價牌有個特點,對一些數字,倒過來看也是合理的數字。如:

藍橋java B國賽題目

1.標題:國王的遺產  X國是個小國。國王K有6個兒子。在臨終前,K國王立下遺囑:國王的一批牛作為遺產要分給他的6個兒子。    其中,大兒子分1/4,二兒子1/5,三兒子1/6,....    直到小兒子分1/9。    牛是活的,不能把一頭牛切開分。    最後還剩下11