題目描述
積木寬高相等,長度不等,每層只能放一個或拼接兩個個積木,每層長度相等,求最大層數。
輸入
給定積木的長度,以空格分隔,例如:3 6 6 3。
輸出
如果可以搭建,返回最大層數,如果不可以返回-1。
樣例輸入
3 6 6 3
樣例輸出
3
樣例輸入
1 4 2 3 6
樣例輸出
-1
代碼:
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String inStr = in.nextLine(); String[] inStrs = inStr.split(" "); int inLen = inStrs.length; int[] brickLength = new int[inLen]; //積木長度 Map<Integer, Integer> lenMap = new HashMap(); for (int i = 0; i < inLen; i++) { int length = Integer.parseInt(inStrs[i]); brickLength[i] = length; int count = 1; if (lenMap.containsKey(length)) count += lenMap.get(length); //如果原來有此數,則加上1 lenMap.put(length, count); } Map<Integer, int[]> brick2LengthMap = new HashMap(); int index = 0; for (int i = 0; i < inLen; i++) { for (int j = 1; j < inLen; j++) { brick2LengthMap.put(index++, new int[]{i, j, brickLength[i] + brickLength[j]}); } } Set<Integer> set = new HashSet(); Set<Integer> seti = new HashSet(); int eq2Count; //相同長度積木的至少個數 for (int i = inLen; i > (inLen - 1) / 2; i--) { eq2Count = inLen - i; //如果此為一層,則兩塊積木。2-4,3-6 int[] eqs = new int[eq2Count]; long counteqs = 0; for (int j = 1; j <= eqs.length; j++) { counteqs += Math.pow(brick2LengthMap.size(), j); } for (int j = 0; j < counteqs; j++) { int temp = j;seti.clear();set.clear(); for (int k = eqs.length - 1; k >= 0 ; k--) { int i1 = (int) (temp / Math.pow(brick2LengthMap.size(), k)); int[] ints = brick2LengthMap.get(i1); temp = temp - (int) (i1 * Math.pow(brick2LengthMap.size(), k)); if (seti.contains(ints[0]) || seti.contains(ints[1])) break; seti.add(ints[0]);seti.add(ints[1]); set.add(ints[2]); } if (set.size() > 1) continue; //針對上面的進行跳出 for (int k = 0; k < brickLength.length; k++) { if (seti.contains(k)) continue; set.add(brickLength[k]); if (set.size() > 1) break; } if (set.size() == 1) { System.out.println(i); return; } } } System.out.println(-1); return; } }機考的時候代碼寫完,測試時間沒夠,提交的代碼。時間到了后還花了20分鍾才測試修改成功