目錄
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); } }