题目描述
积木宽高相等,长度不等,每层只能放一个或拼接两个个积木,每层长度相等,求最大层数。
输入
给定积木的长度,以空格分隔,例如: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分钟才测试修改成功