1. 程式人生 > >2018 java藍橋杯校賽題目

2018 java藍橋杯校賽題目

獲取 並且 很多 此外 abc n) 哥德巴赫 style orm

1.【問題描述】

100 可以表示為帶分數的形式:100 = 3 + 69258 / 714 還可以表示為:100 = 82 + 3546 / 197 註意特征:帶分數中,數字1~9分別出現且只出現一次(不包含0)。 類似這樣的帶分數,100 有 11 種表示法。 題目要求: 從標準輸入讀入一個正整數N (N<1000*1000) 程序輸出該數字用數碼1~9不重復不遺漏地組成帶分數表示的全部種數。 註意:不要求輸出每個表示,只統計有多少表示法! 樣例輸入: 100 樣例輸出: 11 樣例輸入: 105 樣例輸出: 6
這題使用排列組合出每種數字順序,然後對每組數字截出所有可能出現的3段 a1,a2,a3 ,只要滿足a1 + a2 / a3 == N ,就滿足條件

  

package 藍橋杯校賽2018;

import java.util.Scanner;

public class A {
    static int[] t = new int[10];
    static int[] a = new int[10];
    static int num;
    static int count;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        num = in
.nextInt(); f(1); System.out.println(count); }   //獲取數組中一段拼接成數字 static double get(int c, int d) { int result = a[c]; for (int i = c + 1; i <= d; i++) { result = result * 10 + a[i]; } return result; }   //判斷是否滿足 a1 + a2 / a3 == N
static void is() { for (int i = 1; i < 8; i++) { for (int j = 1; j + i < 9; j++) { //System.out.println(1 + "," + i + " " + (i + 1) + "," + (i + j) + " " + (i + j + 1) + "," + 9); //System.out.println(get(1, i) + " " + get(i + 1, i + j) + " " + get(i + j + 1, 9)); if(get(1, i) + get(i + 1, i + j) / get(i + j + 1, 9) == num) { //System.out.println(get(1, i) + " " + get(i + 1, i + j) + " " + get(i + j + 1, 9)); count++; } } } }   //這裏dfs搜索出數字所有排列順序 static void f(int n) { if (n == 10) { //System.out.println(Arrays.toString(a)); is(); return; } for (int i = 1; i < 10; i++) { if (t[i] == 0) { t[i] = 1; a[n] = i; f(n + 1); t[i] = 0; } } } }

2.【問題描述】

如果用a b c d這4個字母組成一個串,有4!=24種,如果把它們排個序,每個串都對應一個序號: abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bacd 6 badc 7 bcad 8 bcda 9 bdac 10 bdca 11 cabd 12 cadb 13 cbad 14 cbda 15 cdab 16 cdba 17 ... 現在有不多於10個兩兩不同的小寫字母,給出它們組成的串,你能求出該串在所有排列中的序號嗎? 【輸入格式】 一行,一個串。 【輸出格式】 一行,一個整數,表示該串在其字母所有排列生成的串中的序號。註意:最小的序號是0。 樣例輸入 bdca 樣例輸出: 11 樣例輸入: cedab 樣例輸出: 70
這題有點坑,10!= 3628800 ,如果直接排列組合出每種情況,那肯定會超時。就用案例 bdca ,題目有一個暗示,4!=24,那麽我們可以把這24種情況分成4份,每份6個:
第0份
  abcd  0
  abdc  1
  acbd  2
  acdb  3
  adbc  4
  adcb  5
第1份
  bacd  6
  badc  7
  bcad  8
  bcda  9
  bdac  10
  bdca  11
第2份
  cabd  12
  cadb  13
  cbad  14
  cbda  15
  cdab  16
  cdba  17
第3份
  ...
b代表了第1份,去掉已經找過的b,剩下dca,3!=6,分成3份,每份2個,

0
  acd  6
  adc  7
1
  cad  8
  cda  9
2
  dac  10
  dca  11
確定了d在第2份,同樣再找到ca,2!=2,分成2份,每份1個,

0
  ac  10
1
  ca  11
直接就可以確定c在第1份中,然後輸出位置11

  

package 藍橋杯校賽2018;

import java.util.Arrays;
import java.util.Scanner;

public class B {
    static String s = "abcdefghij";
    static int[] a = new int[11];
    static int[] t = new int[11];

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println(jc(10));
        s = in.nextLine();
        int slen = s.length();
        int start = 0, end = slen;
        for (int i = 0; i < slen - 1; i++) {
            int len = 0;
            char[] ca = s.toCharArray();
            char[] temp = Arrays.copyOf(ca, ca.length);
            Arrays.sort(temp);
            for (int j = 0, k = 0; j < ca.length; j++) {
                t[temp[j] - a] = k++;
            }
            for (char c : ca) {
                a[len++] = t[c - a];
            }
            end = jc(len);
            int size = end / len;
            end = start + (a[0] + 1) * size - 1;
            start += (a[0] * size);
            len--;
            s = new String(ca, 1, ca.length - 1);
        }
        System.out.println(start);
    }

    public static int jc(int n) {
        if (n == 1) {
            return 1;
        }
        return n * jc(n - 1);
    }

}

問題描述 X星球居民小區的樓房全是一樣的,並且按矩陣樣式排列。其樓房的編號為1,2,3... 當排滿一行時,從下一行相鄰的樓往反方向排號。 比如:當小區排號寬度為6時,開始情形如下: 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 ..... 我們的問題是:已知了兩個樓號m和n,需要求出它們之間的最短移動距離(不能斜線方向移動) 輸入為3個整數w m n,空格分開,都在1到10000範圍內 要求輸出一個整數,表示m n 兩樓間最短移動距離。 樣例輸入: 6 8 2 樣例輸出: 4
先求出豎直高度y1,y2,根據y1,y2可以判斷是否同序或者逆序,
如果n,m的是同序的話,求出他們水平位置x1,x2,然後相減即可
如果n,m是逆序的話,先計算出其中一層豎直對稱位置m1,例如題目中:1對應6,2對應5,3對應4,然後再求出n,m1的水平位置,再相減

  

package 藍橋杯校賽2018;

import java.util.Scanner;

public class C {

    public static void main(String[] args) {
        int k = 4, n = 7, m = 20;
        Scanner in = new Scanner(System.in);
        k = in.nextInt();
        n = in.nextInt();
        m = in.nextInt();
        n--;
        m--;
        int y1 = n / k;
        int y2 = m / k;
        if (y1 > y2) {
            int t = y1;
            y1 = y2;
            y2 = t;
        }
        if ((y2 - y1) % 2 == 0) { // 在同序層上
            int x1 = n % k;
            int x2 = m % k;
            if (x1 > x2) {
                int t = x1;
                x1 = x2;
                x2 = t;
            }
            System.out.println((y2 - y1) + (x2 - x1));
        } else { // 在逆序層上
            int sum = (m / k + 1) * k - 1 + (m / k) * k;
            int x1 = n % k;
            int x2 = (sum - m) % k;
            if (x1 > x2) {
                int t = x1;
                x1 = x2;
                x2 = t;
            }
            System.out.println((y2 - y1) + (x2 - x1));
        }

    }

}

描述

哥德巴赫猜想認為“每一個大於2的偶數,都能表示成兩個質數之和”。

給定一個大於2的偶數N,你能找到兩個質數P和Q滿足P<=Q並且P+Q=N嗎?

輸入

一個偶數N(4 <= N <= 1000000)

輸出

輸出P和Q。如果有多組解,輸出P最小的一組。

樣例輸入

10

樣例輸出

3 7
直接使用線性素數篩選,然後判判斷即可

  

package 藍橋杯校賽2018;

import java.util.Scanner;

public class D {
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        int n;
        n = in.nextInt();
        boolean[] prime = new boolean[n + 1];
        
        for (int i = 2; i <= n; i++) {
            prime[i] = true;
        }

        for (int i = 2; i <= n; i++) {
            if (prime[i]) {
                for (int j = i + i; j <= n; j += i) {
                    prime[j] = false;
                }
            }
        }
        for(int i = 0;i <= n;i++) {
            if(prime[i] && prime[n - i]) {
                System.out.println(i + " " + (n - i));
                break;
            }
        }
    }
}

描述

小Hi參加了一場大型馬拉松運動會,他突然發現面前有一位參賽者背後的號碼竟然和自己一樣,也是666。仔細一看,原來那位參賽者把自己號碼帖反(旋轉180度)了,結果號碼999看上去變成了號碼666。

小Hi知道這次馬拉松一共有N名參賽者,號碼依次是1~N。你能找出所有可能因為貼反而產生歧義的號碼嗎?

一個號碼K可能產生歧義當且僅當反轉之後的號碼是合法的數字K‘,並且滿足1 ≤ K‘ ≤ N且K‘ ≠ K。

例如:

3沒有歧義,因為貼反之後不是合法的數字。

100沒有歧義,因為001以0開頭,不是合法號碼。

101也沒有歧義,因為貼反之後還是101本身。

假設N=10000000,則1025689有歧義,因為貼反之後變成6895201。如果N=2000000,則1025689沒有歧義,因為6895201大於N。

輸入

一個整數N。(1 ≤ N ≤ 100000)

輸出

從小到大輸出1~N之間所有有歧義的號碼。每個號碼一行。

樣例輸入
10
樣例輸出
6
9

根據顛倒數字打表-->數字拆分-->使用表合並顛倒後的數字-->比較是否相等

  

package 藍橋杯校賽2018;

import java.util.Arrays;

public class E {
    static int n = 100;
    static int k;
    static int[] r = new int[] { 0, 1, 2, -1, -1, 5, 9, -1, 8, 6 };

    public static void main(String[] args) {
        for (int i = 1; i <= n; i++) {
            int[] na = split(i);
            // System.out.println(Arrays.toString(na));
            if (na[na.length - 1] == 0) { // 首位為0
                continue;
            }
            int j;
            int m = 0;
            for (j = na.length - 1; j >= 0; j--) {
                if (r[na[j]] == -1) {
                    break;
                }
                m = m * 10 + r[na[j]];
            }
            if (j == -1 && m != i) {
                System.out.println(i);
            }
        }
    }

    public static int length(int n) {
        int len = 0;
        while (n != 0) {
            n /= 10;
            len++;
        }
        return len;
    }

    public static int[] split(int n) {
        int[] ra = new int[length(n)];
        int i = ra.length - 1;
        int r = n % 10;
        n /= 10;
        ra[i--] = r;
        while (n != 0) {
            r = n % 10;
            n /= 10;
            ra[i--] = r;
        }
        return ra;

    }

}

描述

小Hi和他的小夥伴們一起寫了很多代碼。時間一久有些代碼究竟是不是自己寫的,小Hi也分辨不出來了。

於是他實現了一個分類算法,希望用機器學習實現自動分類。

為了評價這個分類算法的優劣,他選出了N份有標記的代碼作測試集,並決定用F1 Score作為評價標準。

給出N份代碼的實際作者是不是小Hi以及分類算法預測的結果,請你計算F1 Score。

輸入

第一行包含一個整數N。(1 <= N <= 1000)

以下N行每行包含兩個字符(+或-)。第一個字符代表這份代碼的實際作者是不是小Hi(+代表是,-代表不是),第二個代表預測的作者是不是小Hi(+代表是,-代表不是)。

輸出

一個百分數,X%,代表答案,X保留兩位小數。

樣例輸入

4  
+ +    
+ -  
- +  
- -

樣例輸出

50.00%

送分題,

  

package 藍橋杯校賽2018;

import java.util.Scanner;

public class F {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        int right = 0;
        n = in.nextInt();
        for (int i = 0; i < n; i++) {
            if (in.next().equals(in.next())) {
                right++;
            }
        }
        System.out.format("%.2f%%", (double) right / n * 100);
    }
}

描述

H國的身份證號碼是一個N位的正整數(首位不能是0)。此外,由於防偽需要,一個N位正整數是合法的身份證號碼當且僅當每位數字都小於等於K,並且任意相鄰兩位數字的乘積也小於等於K。

例如對於K=5, 101、211、210等都是合法的號碼,而106、123、421等都是非法的號碼。

給定一個正整數N以及K,請從小到大輸出所有合法的號碼。

輸入

兩個整數N和K。

對於80%的數據,1 ≤ N ≤ 6。

對於100%的數據,1 ≤ N ≤ 9,1 ≤ K ≤ 5。

輸出

按從小到大的順序輸出所有合法的N位號碼,每個號碼占一行。

樣例輸入

2 4

樣例輸出

10  
11  
12  
13  
14  
20  
21  
22  
30  
31  
40  
41

跟第一題差不多,排列組合,有一點不同,這裏的數字可以重復出現

  

package 藍橋杯校賽2018;

import java.util.Scanner;

public class G {
    static int[] a = new int[11];
    static int k = 4, m = 2;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        m = in.nextInt();
        k = in.nextInt();
        f(0);
    }

    static boolean is() {
        for (int i = 0; i < m; i++) {
            if (a[i] > k) {
                return false;
            }
            if (i > 0 && a[i] * a[i - 1] > k) {
                return false;
            }
        }
        return true;
    }

    static void f(int n) {
        if (n == m) {
            if (is()) {
                for (int i = 0; i < m; i++) {
                    System.out.print(a[i] + " ");
                }
                System.out.println();
            }
            return;
        }
        for (int i = 0; i <= k; i++) {
            if (n == 0 && i == 0) {        //首位為0
                continue;
            }
            a[n] = i;
            f(n + 1);
        }
    }

}

描述

某人有N袋金幣,其中第i袋內金幣的數量是Ai。現在他決定選出2袋金幣送給小Hi,再選2袋金幣送給小Ho,同時使得小Hi和小Ho得到的金幣總數相等。他想知道一共有多少種不同的選擇方法。

具體來說,有多少種下標四元組(i, j, p, q)滿足i, j, p, q兩兩不同,並且i < j, p < q, Ai + Aj = Ap + Aq

例如對於數組A=[1, 1, 2, 2, 2],一共有12種選法:

i j p q
1 3 2 4
1 3 2 5
1 4 2 3
1 4 2 5
1 5 2 3
1 5 2 4
2 3 1 4
2 3 1 5
2 4 1 3
2 4 1 5
2 5 1 3
2 5 1 4

輸入

第一行包含一個整數N。

第二行包含N個整數,A1, A2, A3 ... AN

對於70%的數據,1 <= N <= 100

對於100%的數據,1 <= N <= 1000, 1 <= Ai <= 1000000

輸出

不同選擇的數目。

樣例輸入

5  
1 1 2 2 2

樣例輸出

12
暴力for循環,還不知道會不會超時

  

package 藍橋杯校賽2018;

import java.util.Scanner;

public class H {
    static int n;
    static int[] a = new int[1001];
    static int count;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for (int i = 0; i < n; i++) {
            a[i] = in.nextInt();
        }
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
                for (int q = 0; q < n - 1; q++) {
                    if (q == i || q == j) {
                        continue;
                    }
                    for (int z = q + 1; z < n; z++) {
                        if (z == i || z == j) {
                            continue;
                        }
                        if (a[i] + a[j] == a[q] + a[z]) {
                            //System.out.println((i + 1) + " " + (j + 1) + " " + (q + 1) + " " + (z + 1));
                            count++;
                        }
                    }
                }
            }
        }
        System.out.println(count);
    }

}

2018 java藍橋杯校賽題目