1. 程式人生 > 其它 >第十二屆藍橋杯第一場省賽真題

第十二屆藍橋杯第一場省賽真題

一、ASCII碼(5分)

【問題描述】
已知大寫字母 A 的 ASCII 碼為 65,請問大寫字母 L 的 ASCII 碼是多少?
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一
個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

簽到題。

程式碼

public class ASC {
    public static void main(String[] args) {
        char s = 'L';
        System.out.println((int) s);
    }
}

二、卡片(5分)

【問題描述】
小藍有很多數字卡片,每張卡片上都是數字 0 到 9。 小藍準備用這些卡片來拼一些數,他想從 1 開始拼出正整數,每拼一個,

就儲存起來,卡片就不能用來拼其它數了。 小藍想知道自己能從 1 拼到多少。 例如,當小藍有 30 張卡片,其中 0 到 9 各 3 張,則小藍可以拼出 1 到 10, 但是拼 11 時卡片 1 已經只有一張了,不夠拼出 11。 現在小藍手裡有 0 到 9 的卡片各2021 張,共 20210 張,請問小藍可以從 1 拼到多少? 提示:建議使用計算機程式設計解決問題。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

程式碼

public class 卡片 {
    static int num = 1;
    static
int card = 2021; public static void main(String[] args){ f(); System.out.println(num); } private static void f() { while (true){ int tmp = num; while (tmp>0){ if (tmp%10==1){ if (--card<0){ num--
; return; } } tmp/=10; } num++; } } }

三、直線(10 分)

【問題描述】
在平面直角座標系中,兩點可以確定一條直線。如果有多點在一條直線上,
那麼這些點中任意兩點確定的直線是同一條。
給定平面上 2 × 3 個整點 {(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z},即橫座標
是 0 到 1 (包含 0 和 1) 之間的整數、縱座標是 0 到 2 (包含 0 和 2) 之間的整數
的點。這些點一共確定了 11 條不同的直線。
給定平面上 20 × 21 個整點 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z},即橫
座標是 0 到 19 (包含 0 和 19) 之間的整數、縱座標是 0 到 20 (包含 0 和 20) 之
間的整數的點。請問這些點一共確定了多少條不同的直線。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一
個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

暫時沒思路

程式碼

四、貨物擺放(10分)

【問題描述】
小藍有一個超大的倉庫,可以擺放很多貨物。
現在,小藍有 n 箱貨物要擺放在倉庫,每箱貨物都是規則的正方體。小藍
規定了長、寬、高三個互相垂直的方向,每箱貨物的邊都必須嚴格平行於長、
寬、高。
小藍希望所有的貨物最終擺成一個大的立方體。即在長、寬、高的方向上
分別堆 L、W、H 的貨物,滿足 n = L × W × H。
給定 n,請問有多少種堆放貨物的方案滿足要求。
例如,當 n = 4 時,有以下 6 種方案:1×1×4、1×2×2、1×4×1、2×1×2、 2 × 2 × 1、4 × 1 × 1。
請問,當 n = 2021041820210418 (注意有 16 位數字)時,總共有多少種
方案?
提示:建議使用計算機程式設計解決問題。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

  • 參考了別人的程式碼

程式碼

import java.util.HashSet;
import java.util.Set;

public class 貨物擺放 {
    static int ans = 0;
    static long num = 2021041820210418l;
    public static void main(String[] args) {
        long end = (long)Math.sqrt(num);
        Set<Long> div = new HashSet<>();
        for (long i = 1; i <= end ; i++) {
            if (num % i == 0) {
                div.add(num / i);
                div.add(i);
            }
        }
        Long[] arr = div.toArray(new Long[0]);
        for (long i:arr) {
            for (long j:arr) {
                for (long k : arr) {
                    if (i * j * k == num)
                        ans = ans + 1;
                }
            }
        }
        System.out.println(ans);
    }
}


五、 路徑 (15 分)

【問題描述】
小藍學習了最短路徑之後特別高興,他定義了一個特別的圖,希望找到圖
中的最短路徑。
小藍的圖由 2021 個結點組成,依次編號 1 至 2021。
對於兩個不同的結點 a, b,如果 a 和 b 的差的絕對值大於 21,則兩個結點之間沒有邊相連;如果 a 和 b 的差的絕對值小於等於 21,則兩個點之間有一條長度為 a 和 b 的最小公倍數的無向邊相連。例如:結點 1 和結點 23 之間沒有邊相連;結點 3 和結點 24 之間有一條無向邊,長度為 24;結點 15 和結點 25 之間有一條無向邊,長度為 75。
請計算,結點 1 和結點 2021 之間的最短路徑長度是多少。
提示:建議使用計算機程式設計解決問題。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一
個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

程式碼

六、時間顯示(15分)

【問題描述】
小藍要和朋友合作開發一個時間顯示的網站。在伺服器上,朋友已經獲取
了當前的時間,用一個整數表示,值為從 1970 年 1 月 1 日 00:00:00 到當前時
刻經過的毫秒數。
現在,小藍要在客戶端顯示出這個時間。小藍不用顯示出年月日,只需要
顯示出時分秒即可,毫秒也不用顯示,直接捨去即可。
給定一個用整數表示的時間,請將這個時間對應的時分秒輸出。
【輸入格式】
輸入一行包含一個整數,表示時間。
【輸出格式】
輸出時分秒錶示的當前時間,格式形如 HH:MM:SS,其中 HH 表示時,值
為 0 到 23,MM 表示分,值為 0 到 59,SS 表示秒,值為 0 到 59。時、分、秒
不足兩位時補前導 0。
【樣例輸入 1】
46800999
【樣例輸出 1】
13:00:00
【樣例輸入 2】
1618708103123
【樣例輸出 2】
01:08:23
【評測用例規模與約定】
對於所有評測用例,給定的時間為不超過 1018 的正整數。

import java.io.BufferedInputStream;
import java.util.Scanner;

public class 時間顯示 {
    public static void main(String[] args) {
        Scanner  cin = new Scanner(new BufferedInputStream(System.in));
        long ms = cin.nextLong();

        long hour_div = 60 * 60 * 1000;
        long min_div = 60*1000;

        long hour = (ms / hour_div) %24;
        ms %= hour_div;
        long min = ms/min_div;
        ms %= min_div;
        long sec = ms /1000;

        System.out.printf("%02d:%02d:%02d\n",hour,min,sec);
        cin.close();
    }
}

七、最少砝碼 (20 分)

【問題描述】 你有一架天平。現在你要設計一套砝碼,使得利用這些砝碼可以稱出任意 小於等於 N 的正整數重量。
那麼這套砝碼最少需要包含多少個砝碼? 注意砝碼可以放在天平兩邊。 【輸入格式】 輸入包含一個正整數 N。 【輸出格式】
輸出一個整數代表答案。 【樣例輸入】 7 【樣例輸出】 3 【樣例說明】 3 個砝碼重量是 1、4、6,可以稱出 1 至 7 的所有重量。
1 = 1; 2 = 6 − 4 (天平一邊放 6,另一邊放 4); 3 = 4 − 1; 4 = 4; 5 = 6 − 1; 6 = 6;
7 = 1 + 6; 少於 3 個砝碼不可能稱出 1 至 7 的所有重量。 【評測用例規模與約定】 對於所有評測用例,1 ≤ N ≤
1000000000。

  • 參考別人的解法。

程式碼

import java.io.BufferedInputStream;
import java.util.Scanner;

public class 最少砝碼 {
    public static void main(String[] args) {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int num = cin.nextInt();
        int sum =0,pow=1,cnt=0;
        do {
            sum +=pow;
            pow *=3;
            cnt++;
        }while (sum < num);
        System.out.println(cnt);
        cin.close();
    }
}

八、楊輝三角形 (20 分)

【問題描述】
下面的圖形是著名的楊輝三角形:
在這裡插入圖片描述
在這裡插入圖片描述

如果我們按從上到下、從左到右的順序把所有數排成一列,可以得到如下 數列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1,4, 6, 4, 1, … 給定一個正整數 N,請你輸出數列中第一次出現 N 是在第幾個數? 【輸入格式】 輸入一個整數 N。
【輸出格式】
輸出一個整數代表答案。 【樣例輸入】 6 【樣例輸出】 13 【評測用例規模與約定】 對於 20% 的評測用例,1 ≤ N ≤ 10;對於所有評測用例,1 ≤ N ≤ 1000000000。

程式碼

九、 雙向排序 (25 分)

【問題描述】
給定序列 (a1, a2, · · · , an) = (1, 2, · · · , n),即 ai = i。
小藍將對這個序列進行 m 次操作,每次可能是將 a1, a2, · · · , aqi 降序排列,
或者將 aqi , aqi+1, · · · , an 升序排列。
請求出操作完成後的序列。
【輸入格式】
輸入的第一行包含兩個整數 n, m,分別表示序列的長度和操作次數。
接下來 m 行描述對序列的操作,其中第 i 行包含兩個整數 pi, qi 表示操作
型別和引數。當 pi = 0 時,表示將 a1, a2, · · · , aqi 降序排列;當 pi = 1 時,表示
將 aqi , aqi+1, · · · , an 升序排列。
【輸出格式】
輸出一行,包含 n 個整數,相鄰的整數之間使用一個空格分隔,表示操作
完成後的序列。
【樣例輸入】
3 3
0 3
1 2
0 2
【樣例輸出】
3 1 2
【樣例說明】
原數列為 (1, 2, 3)。 第 1 步後為 (3, 2, 1)。 第 2 步後為 (3, 1, 2)。 第 3 步後為 (3, 1, 2)。與第 2 步操作後相同,因為前兩個數已經是降序了。
【評測用例規模與約定】
對於 30% 的評測用例,n, m ≤ 1000;
對於 60% 的評測用例,n, m ≤ 5000;
對於所有評測用例,1 ≤ n, m ≤ 100000; 0<=pi<=1,1<=qi<=n.

程式碼

十、括號序列(25 分)

【問題描述】
給定一個括號序列,要求儘可能少地新增若干括號使得括號序列變得合法,
當新增完成後,會產生不同的新增結果,請問有多少種本質不同的新增結果。
兩個結果是本質不同的是指存在某個位置一個結果是左括號,而另一個是右括
號。
例如,對於括號序列 (((),只需要新增兩個括號就能讓其合法,有以下幾
種不同的新增結果:()()()、()(())、(())()、(()()) 和 ((()))。
【輸入格式】
輸入一行包含一個字串 s,表示給定的括號序列,序列中只有左括號和
右括號。
【輸出格式】
輸出一個整數表示答案,答案可能很大,請輸出答案除以 1000000007 (即
109 + 7) 的餘數。
【樣例輸入】
((()
【樣例輸出】
5
【評測用例規模與約定】
對於 40% 的評測用例,|s| ≤ 200。
對於所有評測用例,1 ≤ |s| ≤ 5000。

程式碼