算法筆記_117:算法集訓之結果填空題集一(Java)


 目錄

1 空瓶換汽水

2 三人年齡

3 考察團組成

4 微生物增殖

5 除去次方數

6 正六面體染色

7 古堡算式

8 海盜比酒量

9 奇怪的比賽

10 土地測量

 

 


1 空瓶換汽水

 

浪費可恥,節約光榮。飲料店節日搞活動:不用付費,用3個某飲料的空瓶就可以換一瓶該飲料。剛好小明前兩天買了2瓶該飲料喝完了,瓶子還在。他耍了個小聰明,向老板借了一個空瓶,湊成3個,換了一瓶該飲料,喝完還瓶!!
飲料店老板一統計,已經售出該飲料且未還瓶的有12345瓶,那么如果這些飲料的買主都如小明一樣聰明,老板最多還需要送出多少瓶飲料呢?
顯然答案是個正整數。

12345 / 2 = 6172
參考答案:
6172

 

 

 

 

2 三人年齡

 

三個神秘蒙面人來訪F博士。
博士詢問他們年齡時,他們說:我們中年齡最小的不超過19歲。我們3人年齡總和為70歲。且我們三人年齡的乘積是所有可能情況中最大的。
請幫助F博士計算他們的年齡,從小到大排列,用逗號分開。

參考答案:
19,25,26

 

public class Main {

    public void printResult() {
        int[] A = new int[3];
        int max = 0;
        for(int a = 1;a < 100;a++) {
            for(int b = 1;b < 100;b++) {
                for(int c = 1;c < 100;c++) {
                    int min = a;
                    if(min > b)
                        min = b;
                    if(min > c)
                        min = c;
                    if(min > 19)
                        continue;
                    if(a + b + c == 70) {
                        if(a*b*c > max) {
                            A[0] = a;
                            A[1] = b;
                            A[2] = c;
                            max = a*b*c;
                        }
                    }
                        
                }
            }
        }
        System.out.println(A[0]+", "+A[1]+", "+A[2]+", "+max);
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        test.printResult();
    }
    
}

 

 

 

3 考察團組成

 

某飯店招待國外考察團。按照標准,對領導是400元/人,隨團職員200元/人,對司機50元/人。
考察團共36人,招待費結算為3600元,請問領導、職員、司機各幾人。
答案是三個整數,用逗號分隔。

參考答案:
3,5,28

 

public class Main {
    
    public void printResult() {
        for(int a = 0;a <= 36;a++) {
            for(int b = 0;b <= 36;b++) {
                for(int c = 0;c <= 36;c++) {
                    if(a + b + c == 36) {
                        int temp = a * 400 + b * 200 + c * 50;
                        if(temp == 3600)
                            System.out.println(a+", "+b+", "+c);
                    }
                }
            }
        }
        return;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        test.printResult();
    }
}

 

 

 

4 微生物增殖

 

假設有兩種微生物 X 和 Y
X出生后每隔3分鍾分裂一次(數目加倍),Y出生后每隔2分鍾分裂一次(數目加倍)。
一個新出生的X,半分鍾之后吃掉1個Y,並且,從此開始,每隔1分鍾吃1個Y。
現在已知有新出生的 X=10, Y=89,求60分鍾后Y的數目。
如果X=10,Y=90  呢?
本題的要求就是寫出這兩種初始條件下,60分鍾后Y的數目。
題目的結果令你震驚嗎?這不是簡單的數字游戲!真實的生物圈有着同樣脆弱的性質!也許因為你消滅的那只 Y 就是最終導致 Y 種群滅絕的最后一根稻草!

請忍住悲傷,把答案寫在“解答.txt”中,不要寫在這里!
兩個整數,每個1行。
參考答案:
0 94371840 

 

public class Main {
    
    public void printResult(int x, int y) {
        for(int i = 1;i <= 60;i++) {
            y = y -x;
            if(y <= 0) {
                System.out.println("i = "+i);
                break;
            }
            if(i % 2 == 0)
                y = y * 2;
            if(i % 3 == 0)
                x = x * 2;
        }
        System.out.println("x = "+x+", y = "+y);
        return;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        test.printResult(10, 89);
        test.printResult(10, 90);
    }
}

 

 

 

5 除去次方數

 

自然數的平方數是:1 4 9 16 25 …
自然數的立方數是:1 8 27 64 125 …
自然數的4次方數是:1 16 81 256 …
…
這些數字都可以稱為次方數。
1~10000中,去掉所有的次方數,還剩下多少個數字?

參考答案:
9875

 

import java.util.ArrayList;

public class Main {
    
    public void printResult() {
        ArrayList<Long> list = new ArrayList<Long>();
        for(long i = 1;i <= 10000;i++)
            list.add(i);
        int count = 2;
        while(true) {
            for(long i = 1;i <= 100;i++) {
                long a = (long) Math.pow(i, count);
                if(a > 10000)
                    break;
                if(list.contains(a)) {
                    list.remove(list.indexOf(a));
                }
            }
            count++;
            if(count > 50)
                break;
        }
        System.out.println(list.size());
        return;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        test.printResult();
    }
}

 

 

 

6 正六面體染色

 

正六面體用4種顏色染色。
共有多少種不同的染色樣式?
要考慮六面體可以任意旋轉、翻轉。

參考答案:
240 Burnside引理,正方體塗色問題 (n^6 + 3*n^4 + 12*n^3 + 8*n^2)/24  

 

 

 

 

7 古堡算式

 

   福爾摩斯到某古堡探險,看到門上寫着一個奇怪的算式:
    ABCDE * ? = EDCBA
    他對華生說:“ABCDE應該代表不同的數字,問號也代表某個數字!”
    華生:“我猜也是!”
    於是,兩人沉默了好久,還是沒有算出合適的結果來。
    請你利用計算機的優勢,找到破解的答案。
    把 ABCDE 所代表的數字寫出來。

    答案寫在“解答.txt”中,不要寫在這里!

參考答案:
21978

 

import java.util.ArrayList;


public class Main {
    
    public void dfs(ArrayList<Integer> list, int step) {
        if(step == 5) {
            check(list);
            return;
        } else {
            for(int i = 0;i < 10;i++) {
                if(list.contains(i))
                    continue;
                list.add(i);
                dfs(list, step + 1);    
                list.remove(list.size() - 1);
            }
        }
        return;
    }
    
    public void check(ArrayList<Integer> list) {
        if(list.get(0) == 0)
            return;
        int A = 0, B = 0;;
        for(int i = 0;i < list.size();i++) {
            A = A * 10 + list.get(i);
            B = B * 10 + list.get(4 - i);
        }
        for(int i = 1;i < 9;i++) {
            if(A * i == B) {
                System.out.println("A = "+A+", B = "+B+", i = "+i);
            }
        }
        return;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        ArrayList<Integer> list = new ArrayList<Integer>();
        test.dfs(list, 0);
    }
    
}

 

 

 

8 海盜比酒量

 

有一群海盜(不多於20人),在船上比拼酒量。過程如下:打開一瓶酒,所有在場的人平分喝下,有幾個人倒下了。再打開一瓶酒平分,又有倒下的,再次重復...... 直到開了第4瓶酒,坐着的已經所剩無幾,海盜船長也在其中。當第4瓶酒平分喝下后,大家都倒下了。

等船長醒來,發現海盜船擱淺了。他在航海日志中寫到:“......昨天,我正好喝了一瓶.......奉勸大家,開船不喝酒,喝酒別開船......”

請你根據這些信息,推斷開始有多少人,每一輪喝下來還剩多少人沒倒下。
如果有多個可能的答案,請列出所有答案,每個答案占一行。
格式是:人數,人數,...
例如,有一種可能是:20,5,4,2,0
多個答案排列順序不重要。

答案寫在“解答.txt”中,不要寫在這里!


參考答案:
18,9,3,2,0 (1分) 15,10,3,2,0 (2分) 20,5,4,2,0 (0分) 12,6,4,2,0 (2分)

 

public class Main {
    
    public void printResult() {
        for(int a = 20;a > 0;a--) {
            for(int b = a - 1;b > 0;b--) {
                for(int c = b - 1;c > 0;c--) {
                    for(int d = c - 1;d > 0;d--) {
                        int a1 = b * c * d;
                        int a2 = a * c * d;
                        int a3 = a * b * d;
                        int a4 = a * b * c;
                        int b1 = a * b * c * d;
                        if(a1 + a2 + a3 + a4 == b1)
                            System.out.println(a+", "+b+", "+c+", "+d);
                    }
                }
            }
        }
        return;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        test.printResult();
    }
}

 

 

 

9 奇怪的比賽

 

某電視台舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:
每位選手需要回答10個問題(其編號為1到10),越后面越有難度。答對的,當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按錯誤處理)。
每位選手都有一個起步的分數為10分。
某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他(她)哪個題目答對了,哪個題目答錯了嗎?
如果把答對的記為1,答錯的記為0,則10個題目的回答情況可以用僅含有1和0的串來表示。例如:0010110011 就是可能的情況。
你的任務是算出所有可能情況。每個答案占一行。
多個答案順序不重要。

答案寫在“解答.txt”中,不要寫在這里!

參考答案:
0010110011 (0分) 0111010000 (4分) 1011010000 (4分)

 

import java.util.ArrayList;


public class Main {
    public ArrayList<Integer> list = new ArrayList<Integer>();
    
    public void dfs(int[] A, int step) {
        while(step < A.length) {
            list.add(A[step]);
            check();
            step++;
            dfs(A, step);
            list.remove(list.size() - 1);
        }
        return;
    }
    
    public void check() {
        int[] value = new int[11];
        for(int i = 0;i < list.size();i++)
            value[list.get(i)] = 1;
        int x = 10;
        for(int i = 1;i < 11;i++) {
            if(value[i] == 0)
                x = x - i;
            else if(value[i] == 1)
                x = x * 2;
        }
        if(x == 100) {
            for(int i = 1;i < 11;i++)
                System.out.print(value[i]);
            System.out.println();
        }
        return;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        int[] A = {1,2,3,4,5,6,7,8,9,10};
        test.dfs(A, 0);
    }
}

 

 

 

10 土地測量

造成高房價的原因有許多,比如土地出讓價格。既然地價高,土地的面積必須仔細計算。遺憾的是,有些地塊的形狀不規則,比如是如圖【1.jpg】中所示的五邊形。
一般需要把它划分為多個三角形來計算。
已知三邊求三角形的面積需要用海倫定理,參見【2.jpg】
各條邊長數據如下:
AB = 52.1
BC = 57.2
CD = 43.5
DE = 51.9
EA = 33.4
EB = 68.2
EC = 71.9
根據這些數據求五邊形地塊的面積。四舍五入到小數后兩位。只寫結果,不要源代碼!

答案寫在“解答.txt”中,不要寫在這里!

圖1


圖2

參考答案:
3789.86
public class Main {
    
    public double getResult(double a, double b, double c) {
        double p = (a + b + c) / 2;
        double result = Math.sqrt(p * (p - a) * (p - b) * (p - c));
        return result;
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        double result = test.getResult(52.1, 33.4, 68.2);
        result += test.getResult(68.2, 57.2, 71.9);
        result += test.getResult(71.9, 51.9, 43.5);
        System.out.println(result);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM