40道选择题+2道算法题(ACM模式)第一题:第一行输入整数n代表总共有n扇未开的门第二行输入每天给了第几扇门的钥匙,例如 5 3 1 2 4; 第三天给了第一扇门的钥匙从第一扇门开始开启,只有开了前面的门才能开后面的门例如:55 3 1 2 4输出:3 4 4 5 5初始化,将第几扇门的钥匙第几天拿到赋值给数组。例题初始化后的数组为: 3 4 2 5 1之后遍历一遍就可以了 比前一天小就等于前一天的值 3 4 4 5 5public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int[] keyDate = new int[n]; int[] open = new int[n]; for (int i = 0; i < n; i++) { keyDate[i] = scan.nextInt(); open[keyDate[i]-1] = i + 1;//初始化 } for (int i = 1; i < n; i++) { if(open[i] < open[i-1]) open[i] = open[i-1]; } for (int i = 0; i < n-1; i++) { System.out.print(open[i] + " "); } System.out.print(open[n - 1]); }}第二题:给出一些方程仅包含加号等号和乘号;(没有前导0,首尾不为运算符,有且仅有一个等号)请判断这些方程能否通过插入至多一个数位(若原方程成立则可以不插)使得方程成立。插入一个数位即将方程视为一个字符串,并将一个0到9之间的数插入中间,开头或末尾。输入:第一行有一个整数,代表方程的数量。接下来T行是T个方程,方程只有一个等号,且保证输入合法性,没有前导0,前后没有运算符。输出:对于每个方程,若其成立或可以通过往该方程中插入一个数位使得方程成立,则输入Yes,否则输出No。例如:616=1+2 * 37 * 8 * 9=541+1=1+224 * 6=22+215+7=1+211+1=1+5输出:YesYesNoYesYesNo思路:将0-9各个位置插入遍历一遍就可以了注意写的计算器如果是int只能过测82%,改成long可以ACpublic class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int t = scan.nextInt(); for (int i = 0; i < t; i++) { String s = scan.next(); if(isItFunction(s)) System.out.println("Yes"); else System.out.println("No"); } } public static boolean isItFunction(String s) { if(s.length()>1000) return false; String[] str = s.split("="); //如果直接相等 if(calculate(str[0]) == calculate(str[1])) return true; //如果插入一个字符相等 for (int i = 0; i <= s.length(); i++) { StringBuilder strInsert = new StringBuilder(s); for (int j = 0; j <= 9; j++) { strInsert.insert(i, j); str = strInsert.toString().split("="); if(calculate(str[0]) == calculate(str[1])) return true; strInsert.deleteCharAt(i); } } return false; } public static long calculate(String s) { long sum = 0; String num = ""; Stack<Long> stack = new Stack<>(); long temp = 0; for (int i = 0; i < s.length(); i++) { switch (s.charAt(i)){ case '+': if(temp == 0){ stack.push(Long.parseLong(num)); num = ""; }else{ stack.push(stack.pop()*Long.parseLong(num)); num = ""; temp = 0; } break; case '*': if(temp == 0){ stack.push(Long.parseLong(num)); num = ""; temp = stack.peek(); }else{ stack.push(stack.pop()*Long.parseLong(num)); num = ""; temp = stack.peek(); } break; default: num += s.charAt(i); } } if(temp == 0){ stack.push(Long.parseLong(num)); }else{ stack.push(stack.pop()*Long.parseLong(num)); } while (!stack.isEmpty()){ sum += stack.pop(); } return sum; }}