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

1谅摄、問題描述

在計算機(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ù)問題梦碗,左邊括號的個數(shù)一定大于等于右邊括號的個數(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禽绪、問題描述

一個包含有2019個結(jié)點的無向連通圖,最少包含多少條邊洪规?

答案:2018

算法分析

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

4印屁、問題描述

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

答案:2520

算法分析

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

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

給定一個單詞,請使用凱撒密碼將這個單詞加密码倦。
  凱撒密碼是一種替換加密的技術(shù)企孩,單詞中的所有字母都在字母表上向后偏移3位后被替換成密文。即a變?yōu)閐袁稽,b變?yōu)閑柠硕,...,w變?yōu)閦运提,x變?yōu)閍蝗柔,y變?yōu)閎,z變?yōu)閏民泵。
  例如癣丧,lanqiao會變成odqtldr。
輸入格式
  輸入一行栈妆,包含一個單詞胁编,單詞中只包含小寫英文字母。
輸出格式
  輸出一行鳞尔,表示加密后的密文嬉橙。
樣例輸入
lanqiao
樣例輸出
odqtldr
評測用例規(guī)模與約定
  對于所有評測用例,單詞中的字母個數(shù)不超過100寥假。

算法分析

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

時間復(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ù))

給定三個整數(shù) a, b, c,如果一個整數(shù)既不是 a 的整數(shù)倍也不是 b 的整數(shù)倍還不是 c 的整數(shù)倍雀扶,則這個數(shù)稱為反倍數(shù)杖小。
  請問在 1 至 n 中有多少個反倍數(shù)。
輸入格式
  輸入的第一行包含一個整數(shù) n。
  第二行包含三個整數(shù) a, b, c予权,相鄰兩個數(shù)之間用一個空格分隔县踢。
輸出格式
  輸出一行包含一個整數(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蝙昙,判斷每個數(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闪萄、問題描述(螺旋矩陣)

對于一個 n 行 m 列的表格,我們可以使用螺旋的方式給表格依次填上正整數(shù)奇颠,我們稱填好的表格為一個螺旋矩陣败去。
  例如,一個 4 行 5 列的螺旋矩陣如下:
  1 2 3 4 5
  14 15 16 17 6
  13 20 19 18 7
  12 11 10 9 8
輸入格式
  輸入的第一行包含兩個整數(shù) n, m烈拒,分別表示螺旋矩陣的行數(shù)和列數(shù)圆裕。
  第二行包含兩個整數(shù) r, c,表示要求的行號和列號荆几。
輸出格式
  輸出一個整數(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鸭栖。

算法分析

模擬
類似點蚊香這么走,先又握巢,后下晕鹊,后左,后上

時間復(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、問題描述(擺動序列)

如果一個序列的奇數(shù)項都比前一項大溅话,偶數(shù)項都比前一項小晓锻,則稱為一個擺動序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]飞几。
  小明想知道砚哆,長度為 m,每個數(shù)都是 1 到 n 之間的正整數(shù)的擺動序列一共有多少個屑墨。
輸入格式
  輸入一行包含兩個整數(shù) m躁锁,n。
輸出格式
  輸出一個整數(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

時間復(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斩箫、問題描述(植樹)

小明和朋友們一起去郊外植樹吏砂,他們帶了一些在自己實驗室精心研究出的小樹苗。
  小明和朋友們一共有 n 個人乘客,他們經(jīng)過精心挑選狐血,在一塊空地上每個人挑選了一個適合植樹的位置,總共 n 個易核。他們準(zhǔn)備把自己帶的樹苗都植下去匈织。
  然而,他們遇到了一個困難:有的樹苗比較大牡直,而有的位置挨太近缀匕,導(dǎo)致兩棵樹植下去后會撞在一起。
  他們將樹看成一個圓碰逸,圓心在他們找的位置上乡小。如果兩棵樹對應(yīng)的圓相交,這兩棵樹就不適合同時植下(相切不受影響)饵史,稱為兩棵樹沖突满钟。
  小明和朋友們決定先合計合計胜榔,只將其中的一部分樹植下去,保證沒有互相沖突的樹湃番。他們同時希望這些樹所能覆蓋的面積和(圓面積和)最大夭织。
輸入格式
  輸入的第一行包含一個整數(shù) n ,表示人數(shù)吠撮,即準(zhǔn)備植樹的位置數(shù)尊惰。
  接下來 n 行,每行三個整數(shù) x, y, r泥兰,表示一棵樹在空地上的橫弄屡、縱坐標(biāo)和半徑。
輸出格式
  輸出一行包含一個整數(shù)逾条,表示在不沖突下可以植樹的面積和。由于每棵樹的面積都是圓周率的整數(shù)倍投剥,請輸出答案除以圓周率后的值(應(yīng)當(dāng)是一個整數(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)險练对,如果有沖突的圈圈則可以進(jìn)行剪枝,可以降低次數(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年,全中國實現(xiàn)了戶戶通電它呀。作為一名電力建設(shè)者赂摆,小明正在幫助一帶一路上的國家通電挟憔。
  這一次,小明要幫助 n 個村莊通電烟号,其中 1 號村莊正好可以建立一個發(fā)電站绊谭,所發(fā)的電足夠所有村莊使用。
  現(xiàn)在汪拥,這 n 個村莊之間都沒有電線相連达传,小明主要要做的是架設(shè)電線連接這些村莊,使得所有村莊都直接或間接的與發(fā)電站相通迫筑。
  小明測量了所有村莊的位置(坐標(biāo))和高度宪赶,如果要連接兩個村莊,小明需要花費兩個村莊之間的坐標(biāo)距離加上高度差的平方脯燃,形式化描述為坐標(biāo)為 (x_1, y_1) 高度為 h_1 的村莊與坐標(biāo)為 (x_2, y_2) 高度為 h_2 的村莊之間連接的費用為
  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)的平方根。請注意括號的位置辕棚,高度的計算方式與橫縱坐標(biāo)的計算方式不同欲主。
  由于經(jīng)費有限,請幫助小明計算他至少要花費多少費用才能使這 n 個村莊都通電逝嚎。
輸入格式
  輸入的第一行包含一個整數(shù) n 扁瓢,表示村莊的數(shù)量。
  接下來 n 行补君,每個三個整數(shù) x, y, h引几,分別表示一個村莊的橫、縱坐標(biāo)和高度挽铁,其中第一個村莊可以建立發(fā)電站伟桅。
輸出格式
  輸出一行,包含一個實數(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算法,先求出每個點都其他點的距離相叁,跑一遍prim
注意:花費是Math.sqrt(x * x + y * y ) + z * z遵绰,特別注意

時間復(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 ++)
        {
            //找最近點
            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)系作者
  • 序言:七十年代末辽幌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椿访,更是在濱河造成了極大的恐慌乌企,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件成玫,死亡現(xiàn)場離奇詭異加酵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哭当,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門猪腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钦勘,你說我怎么就攤上這事陋葡。” “怎么了彻采?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵腐缤,是天一觀的道長。 經(jīng)常有香客問我颊亮,道長柴梆,這世上最難降的妖魔是什么陨溅? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任终惑,我火速辦了婚禮,結(jié)果婚禮上门扇,老公的妹妹穿的比我還像新娘雹有。我一直安慰自己,他們只是感情好臼寄,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布霸奕。 她就那樣靜靜地躺著,像睡著了一般吉拳。 火紅的嫁衣襯著肌膚如雪质帅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天留攒,我揣著相機(jī)與錄音煤惩,去河邊找鬼。 笑死炼邀,一個胖子當(dāng)著我的面吹牛魄揉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拭宁,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼洛退,長吁一口氣:“原來是場噩夢啊……” “哼瓣俯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兵怯,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彩匕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摇零,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體推掸,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年驻仅,在試婚紗的時候發(fā)現(xiàn)自己被綠了谅畅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡噪服,死狀恐怖毡泻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粘优,我是刑警寧澤仇味,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雹顺,受9級特大地震影響丹墨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嬉愧,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一贩挣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧没酣,春花似錦王财、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至偿衰,卻和暖如春挂疆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背下翎。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工缤言, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漏设。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓墨闲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親郑口。 傳聞我的和親對象是個殘疾皇子鸳碧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容