第十一屆藍(lán)橋杯模擬賽(二)

1、問題描述

在計(jì)算機(jī)存儲中,12.5MB是多少字節(jié)?

答案:13107200

算法分析

1MB = 1024KB,1KB = 1024B,所以12.5MB = 12.5 * 1024 * 1024 = 12800KB * 1024 = 13107200 B

2、問題描述

由1對括號,可以組成一種合法括號序列:()。
由2對括號,可以組成兩種合法括號序列:()()、(())。
由4對括號組成的合法括號序列一共有多少種?

答案:14

算法分析

典型的卡特蘭數(shù)問題,左邊括號的個(gè)數(shù)一定大于等于右邊括號的個(gè)數(shù)

Java 代碼

public class Main {
    static int ans = 0;
    static void dfs(int l,int r,int n)
    {
        if(l == n && r == n)
        {
            ans ++;
            return ;
        }
        if(l < n)
            dfs(l + 1,r,n);
        if(r < l)
            dfs(l,r + 1,n);
    }
    public static void main(String[] args) {
        int n = 4;
        dfs(0,0,n);
        System.out.println(ans);
    }
}

Java 代碼(所有情況輸出出來)

public class Main {
    static int ans = 0;
    static void dfs(int l,int r,int n,String s)
    {
        if(l == n && r == n)
        {
            ans ++;
            System.out.println(s);
            return ;
        }
        if(l < n)
            dfs(l + 1,r,n,s + "(");
        if(r < l)
            dfs(l,r + 1,n,s + ")");
    }
    public static void main(String[] args) {
        int n = 4;
        dfs(0,0,n,"");
        System.out.println(ans);
    }
}

3、問題描述

一個(gè)包含有2019個(gè)結(jié)點(diǎn)的無向連通圖,最少包含多少條邊?

答案:2018

算法分析

n個(gè)結(jié)點(diǎn)的無向連通圖最少需要n - 1條邊

4、問題描述

將LANQIAO中的字母重新排列,可以得到不同的單詞,如LANQIAO、AAILNOQ等,注意這7個(gè)字母都要被用上,單詞不一定有具體的英文意義。
請問,總共能排列如多少個(gè)不同的單詞。

答案:2520

算法分析

7個(gè)字母進(jìn)行全排列得7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 = 5040,由于A出現(xiàn)了2次,因此需要除掉2!,得5040 / 2 = 2520

5、問題描述(凱撒密碼)

給定一個(gè)單詞,請使用凱撒密碼將這個(gè)單詞加密。
  凱撒密碼是一種替換加密的技術(shù),單詞中的所有字母都在字母表上向后偏移3位后被替換成密文。即a變?yōu)閐,b變?yōu)閑,...,w變?yōu)閦,x變?yōu)閍,y變?yōu)閎,z變?yōu)閏。
  例如,lanqiao會變成odqtldr。
輸入格式
  輸入一行,包含一個(gè)單詞,單詞中只包含小寫英文字母。
輸出格式
  輸出一行,表示加密后的密文。
樣例輸入
lanqiao
樣例輸出
odqtldr
評測用例規(guī)模與約定
  對于所有評測用例,單詞中的字母個(gè)數(shù)不超過100。

算法分析

模擬
假設(shè)t = g[idx] + 3,表示該字符向后移動3位的值,若該值比'z'小直接轉(zhuǎn)換,否則判斷g[idx] 是等于'x''y','z'中的哪一個(gè),映射成'a','b','c'

時(shí)間復(fù)雜度O(n)

Java 代碼

import java.util.Scanner;

public class Main {
    static char[] g;
    static void change(int idx)
    {
        int t = g[idx] + 3;
        if(t <= 'z')
        {
            g[idx] = (char)t;
        }
        else
        {
            if(g[idx] == 'x') g[idx] = 'a';
            if(g[idx] == 'y') g[idx] = 'b';
            if(g[idx] == 'z') g[idx] = 'c';
        }
    }
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        g = scan.next().toCharArray();
        for(int i = 0;i < g.length;i ++)
        {
            change(i);
        }
        System.out.println(String.valueOf(g));
    }
}

6、問題描述(反倍數(shù))

給定三個(gè)整數(shù) a, b, c,如果一個(gè)整數(shù)既不是 a 的整數(shù)倍也不是 b 的整數(shù)倍還不是 c 的整數(shù)倍,則這個(gè)數(shù)稱為反倍數(shù)。
  請問在 1 至 n 中有多少個(gè)反倍數(shù)。
輸入格式
  輸入的第一行包含一個(gè)整數(shù) n。
  第二行包含三個(gè)整數(shù) a, b, c,相鄰兩個(gè)數(shù)之間用一個(gè)空格分隔。
輸出格式
  輸出一行包含一個(gè)整數(shù),表示答案。
樣例輸入
30
2 3 6
樣例輸出
10
樣例說明
  以下這些數(shù)滿足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。
評測用例規(guī)模與約定
  對于 40% 的評測用例,1 <= n <= 10000。
  對于 80% 的評測用例,1 <= n <= 100000。
  對于所有評測用例,1 <= n <= 1000000,1 <= a <= n,1 <= b <= n,1 <= c <= n。

算法分析

1枚舉到n,判斷每個(gè)數(shù)是否符合條件即可

時(shí)間復(fù)雜度O(n)

Java 代碼

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int a = scan.nextInt();
        int b = scan.nextInt();
        int c = scan.nextInt();
        int ans = 0;
        for(int i = 1;i <= n;i ++)
        {
            if(i % a != 0 && i % b != 0 && i % c != 0)
                ans ++;
        }
        System.out.println(ans);
    }
}

7、問題描述(螺旋矩陣)

對于一個(gè) n 行 m 列的表格,我們可以使用螺旋的方式給表格依次填上正整數(shù),我們稱填好的表格為一個(gè)螺旋矩陣。
  例如,一個(gè) 4 行 5 列的螺旋矩陣如下:
  1 2 3 4 5
  14 15 16 17 6
  13 20 19 18 7
  12 11 10 9 8
輸入格式
  輸入的第一行包含兩個(gè)整數(shù) n, m,分別表示螺旋矩陣的行數(shù)和列數(shù)。
  第二行包含兩個(gè)整數(shù) r, c,表示要求的行號和列號。
輸出格式
  輸出一個(gè)整數(shù),表示螺旋矩陣中第 r 行第 c 列的元素的值。
樣例輸入
4 5
2 2
樣例輸出
15
評測用例規(guī)模與約定
  對于 30% 的評測用例,2 <= n, m <= 20。
  對于 70% 的評測用例,2 <= n, m <= 100。
  對于所有評測用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。

算法分析

模擬
類似點(diǎn)蚊香這么走,先又,后下,后左,后上

時(shí)間復(fù)雜度O(n^2)

Java 代碼

import java.util.Scanner;

public class Main {
    static int N = 1010;
    static int[][] a = new int[N][N];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        int row = scan.nextInt();
        int col = scan.nextInt();
        int k = 1,i = 1,j = 1;
        a[1][1] = 1;
        while(k != n * m)
        {
            //向右走
            while(j < m && a[i][j + 1] == 0)
            {
                j ++;
                a[i][j] = ++ k;
            }
            //向下走
            while(i < n && a[i + 1][j] == 0)
            {
                i ++;
                a[i][j] = ++ k;
            }
            //向左走
            while(j > 1 && a[i][j - 1] == 0)
            {
                j --;
                a[i][j] = ++ k;
            }
            //向上走
            while(i > 1 && a[i - 1][j] == 0)
            {
                i --;
                a[i][j] = ++ k;
            }
        }
        System.out.println(a[row][col]);
    }
}

8、問題描述(擺動序列)

如果一個(gè)序列的奇數(shù)項(xiàng)都比前一項(xiàng)大,偶數(shù)項(xiàng)都比前一項(xiàng)小,則稱為一個(gè)擺動序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]。
  小明想知道,長度為 m,每個(gè)數(shù)都是 1 到 n 之間的正整數(shù)的擺動序列一共有多少個(gè)。
輸入格式
  輸入一行包含兩個(gè)整數(shù) m,n。
輸出格式
  輸出一個(gè)整數(shù),表示答案。答案可能很大,請輸出答案除以10000的余數(shù)。
樣例輸入
3 4
樣例輸出
14
樣例說明
  以下是符合要求的擺動序列:
  2 1 2
  2 1 3
  2 1 4
  3 1 2
  3 1 3
  3 1 4
  3 2 3
  3 2 4
  4 1 2
  4 1 3
  4 1 4
  4 2 3
  4 2 4
  4 3 4
評測用例規(guī)模與約定
  對于 20% 的評測用例,1 <= n, m <= 5;
  對于 50% 的評測用例,1 <= n, m <= 10;
  對于 80% 的評測用例,1 <= n, m <= 100;
  對于所有評測用例,1 <= n, m <= 1000。

算法分析

image.png

時(shí)間復(fù)雜度 O(n^2)

Java 代碼

import java.util.Scanner;

public class Main {
    static int N = 1010;
    static int mod = 10000;
    static int[][] f = new int[N][N];
            
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int m = scan.nextInt();
        int n = scan.nextInt();
        for(int i = 1;i <= n;i ++) f[1][i] = 1;
        for(int i = 2;i <= m;i ++)
        {
            if(i % 2 == 0)
            {
                for(int j = n;j >= 1;j --)
                     f[i][j] = (f[i - 1][j + 1] + f[i][j + 1]) % mod;
            }
            else
            {
                for(int j = 1;j <= n;j ++)
                    f[i][j] = (f[i - 1][j - 1] + f[i][j - 1]) % mod;
            }
        }
        long res = 0;
        for(int i = 1;i <= n;i ++) res = (res + f[m][i]) % mod;
        System.out.println(res);
    }
}

9、問題描述(植樹)

小明和朋友們一起去郊外植樹,他們帶了一些在自己實(shí)驗(yàn)室精心研究出的小樹苗。
  小明和朋友們一共有 n 個(gè)人,他們經(jīng)過精心挑選,在一塊空地上每個(gè)人挑選了一個(gè)適合植樹的位置,總共 n 個(gè)。他們準(zhǔn)備把自己帶的樹苗都植下去。
  然而,他們遇到了一個(gè)困難:有的樹苗比較大,而有的位置挨太近,導(dǎo)致兩棵樹植下去后會撞在一起。
  他們將樹看成一個(gè)圓,圓心在他們找的位置上。如果兩棵樹對應(yīng)的圓相交,這兩棵樹就不適合同時(shí)植下(相切不受影響),稱為兩棵樹沖突。
  小明和朋友們決定先合計(jì)合計(jì),只將其中的一部分樹植下去,保證沒有互相沖突的樹。他們同時(shí)希望這些樹所能覆蓋的面積和(圓面積和)最大。
輸入格式
  輸入的第一行包含一個(gè)整數(shù) n ,表示人數(shù),即準(zhǔn)備植樹的位置數(shù)。
  接下來 n 行,每行三個(gè)整數(shù) x, y, r,表示一棵樹在空地上的橫、縱坐標(biāo)和半徑。
輸出格式
  輸出一行包含一個(gè)整數(shù),表示在不沖突下可以植樹的面積和。由于每棵樹的面積都是圓周率的整數(shù)倍,請輸出答案除以圓周率后的值(應(yīng)當(dāng)是一個(gè)整數(shù))。
樣例輸入
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
樣例輸出
12
評測用例規(guī)模與約定
  對于 30% 的評測用例,1 <= n <= 10;
  對于 60% 的評測用例,1 <= n <= 20;
  對于所有評測用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。

算法分析

dfs每一種情況,枚舉到當(dāng)前的圈圈,有選和不選兩種情況,當(dāng)當(dāng)前圈圈和前面選了的圈圈沒有重復(fù)的面積,則可以選,也可以選擇不選,最壞的情況是所有圈圈都能選,則要運(yùn)行2^30 = 10^9次,check函數(shù)還需要額外遍歷u次,分分鐘有g(shù)g的風(fēng)險(xiǎn),如果有沖突的圈圈則可以進(jìn)行剪枝,可以降低次數(shù)

時(shí)間復(fù)雜度

不好分析,存在O(2^n)的上限

Java 代碼

import java.util.Scanner;

public class Main {
    static int N = 35;
    static int n;
    static int[] x = new int[N];
    static int[] y = new int[N];
    static int[] r = new int[N];
    static int ans = Integer.MIN_VALUE;
    static boolean[] st = new boolean[N];
    static boolean check(int u)
    {
        for(int i = 0;i < u;i ++)
        {
            if(st[i])
            {
                int d = (x[i] - x[u]) * (x[i] - x[u]) + (y[i] - y[u]) * (y[i] - y[u]);
                if((r[i] + r[u]) * (r[i] + r[u]) > d) return false;
            }
        }
        return true;
    }
    static void dfs(int u,int sum)
    {
        if(u == n)
        {
            ans = Math.max(ans, sum);
            return ;
        }
        //選
        if(check(u))
        {
            st[u] = true;
            dfs(u + 1,sum + r[u] * r[u]);
            st[u] = false;
        }
        //不選
        dfs(u + 1,sum);
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        for(int i = 0;i < n;i ++)
        {
            x[i] = scan.nextInt();
            y[i] = scan.nextInt();
            r[i] = scan.nextInt();
        }
        dfs(0,0);
        System.out.println(ans);
    }
}

10、問題描述(通電)

2015年,全中國實(shí)現(xiàn)了戶戶通電。作為一名電力建設(shè)者,小明正在幫助一帶一路上的國家通電。
  這一次,小明要幫助 n 個(gè)村莊通電,其中 1 號村莊正好可以建立一個(gè)發(fā)電站,所發(fā)的電足夠所有村莊使用。
  現(xiàn)在,這 n 個(gè)村莊之間都沒有電線相連,小明主要要做的是架設(shè)電線連接這些村莊,使得所有村莊都直接或間接的與發(fā)電站相通。
  小明測量了所有村莊的位置(坐標(biāo))和高度,如果要連接兩個(gè)村莊,小明需要花費(fèi)兩個(gè)村莊之間的坐標(biāo)距離加上高度差的平方,形式化描述為坐標(biāo)為 (x_1, y_1) 高度為 h_1 的村莊與坐標(biāo)為 (x_2, y_2) 高度為 h_2 的村莊之間連接的費(fèi)用為
  sqrt((x_1-x_2)(x_1-x_2)+(y_1-y_2)(y_1-y_2))+(h_1-h_2)*(h_1-h_2)。
  在上式中 sqrt 表示取括號內(nèi)的平方根。請注意括號的位置,高度的計(jì)算方式與橫縱坐標(biāo)的計(jì)算方式不同。
  由于經(jīng)費(fèi)有限,請幫助小明計(jì)算他至少要花費(fèi)多少費(fèi)用才能使這 n 個(gè)村莊都通電。
輸入格式
  輸入的第一行包含一個(gè)整數(shù) n ,表示村莊的數(shù)量。
  接下來 n 行,每個(gè)三個(gè)整數(shù) x, y, h,分別表示一個(gè)村莊的橫、縱坐標(biāo)和高度,其中第一個(gè)村莊可以建立發(fā)電站。
輸出格式
  輸出一行,包含一個(gè)實(shí)數(shù),四舍五入保留 2 位小數(shù),表示答案。
樣例輸入
4
1 1 3
9 9 7
8 8 6
4 5 4
樣例輸出
17.41
評測用例規(guī)模與約定
  對于 30% 的評測用例,1 <= n <= 10;
  對于 60% 的評測用例,1 <= n <= 100;
  對于所有評測用例,1 <= n <= 1000,0 <= x, y, h <= 10000。

算法分析

稠密圖求最小生成樹問題,prim算法,先求出每個(gè)點(diǎn)都其他點(diǎn)的距離,跑一遍prim
注意:花費(fèi)是Math.sqrt(x * x + y * y ) + z * z,特別注意

時(shí)間復(fù)雜度O(n^2)

Java 代碼

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    static int N = 1010;
    static int n;
    static int INF = 0x3f3f3f3f;
    static double[][] g = new double[N][N];
    static int[] a = new int[N];
    static int[] b = new int[N];
    static int[] c = new int[N];
    static double[] dist = new double[N];
    static boolean[] st = new boolean[N];
    static double get(int i,int j)
    {
        int x = a[i] - a[j];
        int y = b[i] - b[j];
        int z = c[i] - c[j];
        return Math.sqrt(x * x + y * y ) + z * z;
    }
    static double prim()
    {
        Arrays.fill(dist, INF);
        double res = 0;
        for(int i = 0;i < n;i ++)
        {
            //找最近點(diǎn)
            int t = -1;
            for(int j = 1;j <= n;j ++)
            {
                if(!st[j] && (t == -1 || dist[j] < dist[t]))
                    t = j;
            }
            //標(biāo)記
            st[t] = true;
            
            if(i != 0) res += dist[t]; 
            //更新
            for(int j = 1;j <= n;j ++)
            {
                dist[j] = Math.min(dist[j], g[t][j]);
            }
        }
        return res;
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        for(int i = 1;i <= n;i ++)
        {
            String[] s1 = br.readLine().split(" ");
            int x = Integer.parseInt(s1[0]);
            int y = Integer.parseInt(s1[1]);
            int z = Integer.parseInt(s1[2]);
            a[i] = x;
            b[i] = y;
            c[i] = z;
        }
        for(int i = 1;i <= n;i ++)
            for(int j = i + 1;j <= n;j ++)
            {
                double d = get(i,j);
                g[i][j] = g[j][i] = d;                  
            }
        System.out.printf("%.2f",prim());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容