目錄
前言:以下試題解答代碼部分僅供參考,若有不當之處,還請路過的同學提醒一下~
1 煤球數目
煤球數目 有一堆煤球,堆成三角棱錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100層,共有多少個煤球? 請填表示煤球總數目的數字。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 171700
public class Main { public static void main(String[] args) { long sum = 0; long a = 0; for(long i = 1;i <= 100;i++) { a += i; sum += a; } System.out.println(sum); } }
2 生日蠟燭
生日蠟燭 某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來,他一共吹熄了236根蠟燭。 請問,他從多少歲開始過生日party的? 請填寫他開始過生日party的年齡數。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 26
public class Main { public static void main(String[] args) { for(int i = 1;i <= 100;i++) { int sum = i; for(int j = i + 1;j <= 100;j++) { sum += j; if(sum == 236) System.out.println("i = "+i+", j = "+j); if(sum > 236) break; } } } }
3 搭積木
搭積木 小明最近喜歡搭數字積木, 一共有10塊積木,每個積木上有一個數字,0~9。 搭積木規則: 每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。 最后搭成4層的金字塔形,必須用完所有的積木。 下面是兩種合格的搭法: 0 1 2 3 4 5 6 7 8 9 0 3 1 7 5 2 9 8 6 4 請你計算這樣的搭法一共有多少種? 請填表示總數目的數字。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 768
public class Main { public static int count = 0; public void swap(int[] A, int a, int b) { int temp = A[a]; A[a] = A[b]; A[b] = temp; } public void dfs(int[] A, int step) { if(step == A.length) { if(check(A)) { count++; } return; } else { for(int i = step;i < A.length;i++) { swap(A, i, step); dfs(A, step + 1); swap(A, i, step); } } return; } public boolean check(int[] A) { if(A[0] < A[1] && A[0] < A[2]) { if(A[1] < A[3] && A[1] < A[4] && A[2] < A[4] && A[2] < A[5]) { if(A[3] < A[6] && A[3] < A[7] && A[4] < A[7] && A[4] < A[8] && A[5] < A[8] && A[5] < A[9]) return true; } } return false; } public static void main(String[] args) { Main test = new Main(); int[] A = {0,1,2,3,4,5,6,7,8,9}; test.dfs(A, 0); System.out.println(count); } }
4 分小組
分小組 9名運動員參加比賽,需要分3組進行預賽。 有哪些分組的方案呢? 我們標記運動員為 A,B,C,... I 下面的程序列出了所有的分組方法。 該程序的正常輸出為: ABC DEF GHI ABC DEG FHI ABC DEH FGI ABC DEI FGH ABC DFG EHI ABC DFH EGI ABC DFI EGH ABC DGH EFI ABC DGI EFH ABC DHI EFG ABC EFG DHI ABC EFH DGI ABC EFI DGH ABC EGH DFI ABC EGI DFH ABC EHI DFG ABC FGH DEI ABC FGI DEH ABC FHI DEG ABC GHI DEF ABD CEF GHI ABD CEG FHI ABD CEH FGI ABD CEI FGH ABD CFG EHI ABD CFH EGI ABD CFI EGH ABD CGH EFI ABD CGI EFH ABD CHI EFG ABD EFG CHI ..... (以下省略,總共560行)。 public class A { public static String remain(int[] a) { String s = ""; for(int i=0; i<a.length; i++){ if(a[i] == 0) s += (char)(i+'A'); } return s; } public static void f(String s, int[] a) { for(int i=0; i<a.length; i++){ if(a[i]==1) continue; a[i] = 1; for(int j=i+1; j<a.length; j++){ if(a[j]==1) continue; a[j]=1; for(int k=j+1; k<a.length; k++){ if(a[k]==1) continue; a[k]=1; System.out.println(__________________________________); //填空位置 a[k]=0; } a[j]=0; } a[i] = 0; } } public static void main(String[] args) { int[] a = new int[9]; a[0] = 1; for(int b=1; b<a.length; b++){ a[b] = 1; for(int c=b+1; c<a.length; c++){ a[c] = 1; String s = "A" + (char)(b+'A') + (char)(c+'A'); f(s,a); a[c] = 0; } a[b] = 0; } } } 仔細閱讀代碼,填寫划線部分缺少的內容。 注意:不要填寫任何已有內容或說明性文字。 s +" "+(char)(i+'A') + (char)(j+'A') + (char)(k+'A')+" "+remain(a)
5 抽簽
抽簽 X星球要派出一個5人組成的觀察團前往W星。 其中: A國最多可以派出4人。 B國最多可以派出2人。 C國最多可以派出2人。 .... 那么最終派往W星的觀察團會有多少種國別的不同組合呢? 下面的程序解決了這個問題。 數組a[] 中既是每個國家可以派出的最多的名額。 程序執行結果為: DEFFF CEFFF CDFFF CDEFF CCFFF CCEFF CCDFF CCDEF BEFFF BDFFF BDEFF BCFFF BCEFF BCDFF BCDEF .... (以下省略,總共101行) public class A { public static void f(int[] a, int k, int n, String s) { if(k==a.length){ if(n==0) System.out.println(s); return; } String s2 = s; for(int i=0; i<=a[k]; i++){ _____________________________; //填空位置 s2 += (char)(k+'A'); } } public static void main(String[] args) { int[] a = {4,2,2,1,1,3}; f(a,0,5,""); } } 仔細閱讀代碼,填寫划線部分缺少的內容。 注意:不要填寫任何已有內容或說明性文字。 f(a, k + 1, n - i,s2)
6 寒假作業
寒假作業 現在小學的數學題目也不是那么好玩的。 看看這個寒假作業: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果顯示不出來,可以參見【圖1.jpg】) 每個方塊代表1~13中的某一個數字,但不能重復。 比如: 6 + 7 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 以及: 7 + 6 = 13 9 - 8 = 1 3 * 4 = 12 10 / 2 = 5 就算兩種解法。(加法,乘法交換律后算不同的方案) 你一共找到了多少種方案? 請填寫表示方案數目的整數。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 64
//方法1:DFS搜索 import java.util.ArrayList; public class Main { public ArrayList<Integer> list = new ArrayList<Integer>(); public static int count = 0; public boolean check() { int len = list.size(); if(len >= 3) { if(list.get(0) + list.get(1) != list.get(2)) return false; } if(len >= 6) { if(list.get(3) - list.get(4) != list.get(5)) return false; } if(len >= 9) { if(list.get(6) * list.get(7) != list.get(8)) return false; } if(len >= 12) { if(list.get(9) / list.get(10) != list.get(11) || list.get(9) % list.get(10) != 0) return false; } return true; } public void dfs(int step) { if(step == 12) { System.out.println(list); count++; return; } else { for(int i = 1;i <= 13;i++) { if(list.contains(i)) continue; list.add(i); if(check() == false) { //類似八皇后問題,此處進行減枝操作 list.remove(list.indexOf(i)); continue; } dfs(step + 1); list.remove(list.size() - 1); } } return; } public static void main(String[] args) { Main test = new Main(); test.dfs(0); System.out.println(count); } }
//方法2:蠻力枚舉 import java.util.ArrayList; import java.util.Collections; public class Main1 { public static long count = 0; public void printResult() { for(int a1 = 1;a1 <= 13;a1++) { for(int a2 = 1;a2 <= 13;a2++) { if(a1 == a2 || a1 + a2 > 13) continue; for(int a3 = 1;a3 <= 13;a3++) { for(int a4 = 1;a4 <= 13;a4++) { if(a3 == a4 || a3 - a4 < 1) continue; for(int a5 = 1;a5 <= 13;a5++) { for(int a6 = 1;a6 <= 13;a6++) { if(a5 == a6 || a5 * a6 > 13) continue; for(int a7 = 1;a7 <= 13;a7++) { for(int a8 = 1;a8 <= 13;a8++) { if(a7 == a8 || a7 % a8 != 0) continue; ArrayList<Integer> list = new ArrayList<Integer>(); list.add(a1); list.add(a2); list.add((a1 + a2)); list.add(a3); list.add(a4); list.add((a3 - a4)); list.add(a5); list.add(a6); list.add((a5 * a6)); list.add(a7); list.add(a8); list.add((a7 / a8)); ArrayList<Integer> tempList = new ArrayList<Integer>(); for(int i = 0;i < list.size();i++) tempList.add(list.get(i)); Collections.sort(list); boolean judge = true; for(int i = 1;i < list.size();i++) { if(list.get(i - 1) == list.get(i)) { judge = false; break; }else { continue; } } if(judge == true) { System.out.println(tempList); count++; } } } } } } } } } } public static void main(String[] args) { Main1 test = new Main1(); test.printResult(); System.out.println(count); } }
7 剪郵票
剪郵票 如【圖1.jpg】, 有12張連在一起的12生肖的郵票。 現在你要從中剪下5張來,要求必須是連着的。 (僅僅連接一個角不算相連) 比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。 請你計算,一共有多少種不同的剪取方法。 請填寫表示方案數目的整數。 注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。 116
import java.util.ArrayList; public class Main { public ArrayList<Integer> list = new ArrayList<Integer>(); public static int[] A = {1,2,3,4,5,6,7,8,9,10,11,12}; public static boolean[] visited = new boolean[5]; public static long count = 0; public void dfs(int step) { while(step < A.length) { list.add(A[step]); if(list.size() == 5) { if(check()) { System.out.println(list); count++; } } step++; dfs(step); list.remove(list.size() - 1); } } public boolean check() { for(int i = 0;i < 5;i++) visited[i] = false; int start = list.get(0); dfsPath(start, 0); for(int i = 0;i < 5;i++) { if(visited[i] == false) return false; } return true; } public void dfsPath(int a, int i) { visited[i] = true; int start1 = a + 1; int start2 = a - 1; int start3 = a + 4; int start4 = a - 4; int r = (a - 1) / 4; if(list.contains(start1) && (start1 - 1) / 4 == r && !visited[list.indexOf(start1)]) dfsPath(start1, list.indexOf(start1)); if(list.contains(start2) && (start2 - 1) / 4 == r && !visited[list.indexOf(start2)]) dfsPath(start2, list.indexOf(start2)); if(list.contains(start3) && !visited[list.indexOf(start3)]) dfsPath(start3, list.indexOf(start3)); if(list.contains(start4) && !visited[list.indexOf(start4)]) dfsPath(start4, list.indexOf(start4)); } public static void main(String[] args) { Main test = new Main(); test.dfs(0); System.out.println(count); } }
8 取球博弈
取球博弈 兩個人玩取球的游戲。 一共有N個球,每人輪流取球,每次可取集合{n1,n2,n3}中的任何一個數目。 如果無法繼續取球,則游戲結束。 此時,持有奇數個球的一方獲勝。 如果兩人都是奇數,則為平局。 假設雙方都采用最聰明的取法, 第一個取球的人一定能贏嗎? 試編程解決這個問題。 輸入格式: 第一行3個正整數n1 n2 n3,空格分開,表示每次可取的數目 (0<n1,n2,n3<100) 第二行5個正整數x1 x2 ... x5,空格分開,表示5局的初始球數(0<xi<1000) 輸出格式: 一行5個字符,空格分開。分別表示每局先取球的人能否獲勝。 能獲勝則輸出+, 次之,如有辦法逼平對手,輸出0, 無論如何都會輸,則輸出- 例如,輸入: 1 2 3 1 2 3 4 5 程序應該輸出: + 0 + 0 - 再例如,輸入: 1 4 5 10 11 12 13 15 程序應該輸出: 0 - 0 + + 再例如,輸入: 2 3 5 7 8 9 10 11 程序應該輸出: + 0 0 0 0 資源約定: 峰值內存消耗(含虛擬機) < 256M CPU消耗 < 3000ms 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效代碼處理。 本題是拈游戲的一個拓展,考查減治法和動態規划法思想的運用,下面代碼,對於題中所給三組數據均可以通過,但是對於平局(均為奇數或均為偶數)細節處理問題上有待證明,感覺自己處理的不夠嚴謹。下面代碼僅供參考哦~
import java.util.Scanner; public class Main { public static int[] value = new int[1000]; public static int[] getN = new int[3]; public static int[] init = new int[5]; public static char[] result = {'-','0','0','+'}; public static void main(String[] args) { Scanner in = new Scanner(System.in); for(int i = 0;i < 3;i++) getN[i] = in.nextInt(); for(int i = 0;i < 5;i++) init[i] = in.nextInt(); int minN = Math.min(getN[0], Math.min(getN[1], getN[2])); if(minN % 2 == 1) //此處關於平局,兩者是均為奇數,還是均為偶數問題,這里處理原因,是我自己猜想 value[0] = 1; //代表平局,兩者默認均為奇數個 else value[0] = 2; //代表平局,兩者默認均為偶數個 for(int i = 1;i < minN;i++) value[i] = 2; //0代表負,1和2代表平局,3代表勝 for(int i = minN;i < 1000;i++) { int temp = 0; //初始化,當前i個球,先取者必輸 for(int j = 0;j < 3;j++) { if(i - getN[j] < 0) continue; if(i - getN[j] == 0 && getN[j] % 2 == 1) temp = 3; if(value[i - getN[j]] == 0) { //表示i - getN[j]個球先取時,必輸 if(getN[j] % 2 == 0) temp = 3; //此時最終結果為兩人取的球均為偶數個,但是若temp取三個數中另外一個數時 //,是必贏結果,則舍棄這個平局結果 else temp = 2 > temp ? 2 : temp; } if(value[i - getN[j]] == 1) { //表示i - getN[j]個球先取時,兩人取球均為奇數個 if(getN[j] % 2 == 0) temp = 1 > temp ? 1 : temp; //此處做比較同上 } if(value[i - getN[j]] == 2) {//表示i - getN[j]個球先取時,兩人取球均為偶數個 if(getN[j] % 2 == 1) temp = 3; //此種情況出現,必贏,不必做比較判斷 else temp = 2 > temp ? 2 : temp; //此處比較同上,排除必輸情況 } if(value[i - getN[j]] == 3) {//表示i - getN[j]個球先取時,必贏 if(getN[j] % 2 == 1) temp = 1 > temp ? 1 : temp; } } value[i] = temp; //當前i個球,先取者最終輸贏結果 } //打印題意最終結果 for(int i = 0;i < 5;i++) System.out.print(result[value[init[i]]]+" "); } }
9 交換瓶子
交換瓶子 有N個瓶子,編號 1 ~ N,放在架子上。 比如有5個瓶子: 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。 經過若干次后,使得瓶子的序號為: 1 2 3 4 5 對於這么簡單的情況,顯然,至少需要交換2次就可以復位。 如果瓶子更多呢?你可以通過編程來解決。 輸入格式為兩行: 第一行: 一個正整數N(N<10000), 表示瓶子的數目 第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。 輸出數據為一行一個正整數,表示至少交換多少次,才能完成排序。 例如,輸入: 5 3 1 2 5 4 程序應該輸出: 3 再例如,輸入: 5 5 4 3 2 1 程序應該輸出: 2 資源約定: 峰值內存消耗(含虛擬機) < 256M CPU消耗 < 1000ms 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效代碼處理。
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public static int count = 0; public static ArrayList<Integer> list = new ArrayList<Integer>(); public void getResult() { ArrayList<Integer> tempList = new ArrayList<Integer>(); int len = list.size(); for(int i = 0;i < len;i++) tempList.add(list.get(i)); Collections.sort(tempList); //對鏈表中元素進行從小到大排序 while(true) { for(int i = 0;i < len;i++) { int value = list.get(i); int tempi = tempList.indexOf(value); if(i == tempi) continue; else { Collections.swap(list, i, tempi); count++; } } boolean judge = true; for(int i = 0;i < len;i++) { if(list.get(i) != tempList.get(i)) { judge = false; break; } } if(judge == true) break; } return; } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); int n = in.nextInt(); for(int i = 1;i <= n;i++) { int a = in.nextInt(); list.add(a); } test.getResult(); System.out.println(count); } }
10 壓縮變換
壓縮變換 小明最近在研究壓縮算法。 他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。 然而,要使數值很小是一個挑戰。 最近,小明需要壓縮一些正整數的序列,這些序列的特點是,后面出現的數字很大可能是剛出現過不久的數字。對於這種特殊的序列,小明准備對序列做一個變換來減小數字的值。 變換的過程如下: 從左到右枚舉序列,每枚舉到一個數字,如果這個數字沒有出現過,剛將數字變換成它的相反數,如果數字出現過,則看它在原序列中最后的一次出現后面(且在當前數前面)出現了幾種數字,用這個種類數替換原來的數字。 比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在變換過程為: a1: 1未出現過,所以a1變為-1; a2: 2未出現過,所以a2變為-2; a3: 2出現過,最后一次為原序列的a2,在a2后、a3前有0種數字,所以a3變為0; a4: 1出現過,最后一次為原序列的a1,在a1后、a4前有1種數字,所以a4變為1; a5: 2出現過,最后一次為原序列的a3,在a3后、a5前有1種數字,所以a5變為1。 現在,給出原序列,請問,按這種變換規則變換后的序列是什么。 輸入格式: 輸入第一行包含一個整數n,表示序列的長度。 第二行包含n個正整數,表示輸入序列。 輸出格式: 輸出一行,包含n個數,表示變換后的序列。 例如,輸入: 5 1 2 2 1 2 程序應該輸出: -1 -2 0 1 1 再例如,輸入: 12 1 1 2 3 2 3 1 2 2 2 3 1 程序應該輸出: -1 0 -2 -3 1 1 2 2 0 0 2 2 數據規模與約定 對於30%的數據,n<=1000; 對於50%的數據,n<=30000; 對於100%的數據,1 <=n<=100000,1<=ai<=10^9 資源約定: 峰值內存消耗(含虛擬機) < 256M CPU消耗 < 3000ms 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。 注意:主類的名字必須是:Main,否則按無效代碼處理。
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public static int[] arrayN; public int getValue(int[] tempN, int position) { if(position == 0) return -1; int i = position - 1; for(;i >= 0;i--) { if(tempN[i] == tempN[position]) break; if(i == 0) i--; } if(i < 0) return -1; ArrayList<Integer> list = new ArrayList<Integer>(); i = i + 1; for(;i < position;i++) list.add(tempN[i]); if(list.size() == 0) return 0; Collections.sort(list); int count = 1; for(int j = 1;j < list.size();j++) { if(list.get(j) != list.get(j - 1)) count++; } return count; } public void getResult() { int len = arrayN.length; int[] tempN = new int[len]; for(int i = 0;i < len;i++) tempN[i] = arrayN[i]; for(int i = 0;i < len;i++) { int value = getValue(tempN, i); if(value == -1) arrayN[i] = (-1) * arrayN[i]; else arrayN[i] = value; } //打印最終結果 for(int i = 0;i < len;i++) System.out.print(arrayN[i]+" "); } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); int n = in.nextInt(); arrayN = new int[n]; for(int i = 0;i < n;i++) arrayN[i] = in.nextInt(); test.getResult(); } }