第一题:判断输入的字符串是不是对称的 ac
思路:把26个字母中对称的字母放在list或者set中,然后判断字符串首尾字符是否相等,并且字符是否为对称的字母
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); List<Character> list = new ArrayList<>(); list.add('A'); list.add('H'); list.add('I'); list.add('M'); list.add('O'); list.add('T'); list.add('U'); list.add('V'); list.add('W'); list.add('X'); list.add('Y'); for (int i = 0; i < 20; i++) { String string = in.nextLine(); int left = 0; int right = string.length() - 1; boolean flag = true; while (left <= right) { if (!list.contains(string.charAt(left)) || !list.contains(string.charAt(right))) { System.out.println("NO"); flag = false; break; } if (string.charAt(left) != string.charAt(right)) { System.out.println("N"); flag = false; break; } left++; right--; } if (flag) { System.out.println("YES"); } } } }第二题: ac
/** * 魔塔闯关 * 魔塔是一款时尚经典小游戏,我们将魔塔简化后的规则描述如下: * 魔塔有n关,而你可以自由选择前往攻略哪一关,每一关只能获得一次分数。 * 第i关攻略完成后,你将会获得ai的分数。 * 某些关有一个特殊的宝物,你只能在攻略完这一关的时候使用这个宝物( * 也可以不使用,额外的宝物并不能留到其他关卡使用), * 这个宝物将使得这一关不得分,但是将你现有的总得分乘以2作为新的得分。 * 你现在知道了所有关卡的通关方法,也知道了每一关的得分和是否有宝物,你现在想知道,怎么选择攻略的顺序和使用宝物的方法才能让自己的得分最大化? * 输入描述 * 输入第一行包含一个整数n * * 接下来n行,每行两个整数ai,bi。ai表示第i关的分数,若bi为1,则第i关有宝物。 * * 输出描述 * 输出包含一个数,即能获得的最大分数 */
思路:先把没有宝物的分数加在结果中,把有宝物的关卡按照分数排序,从大到小遍历,如果大于当前分数,就直接加上关卡分数;否则直接乘以2;
贪心问题
代码: public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[][] nums = new int[n][2]; int count = 0; long res = 0; for (int i = 0; i < n; i++) { int a = in.nextInt(); int b = in.nextInt(); if (b == 0) { res += a; } else { count++; } nums[i][0] = a; nums[i][1] = b; } int[] temp = new int[count]; int index = 0; for (int i = 0; i < n; i++) { if (nums[i][1] == 1) { temp[index++] = nums[i][0]; } } Arrays.sort(temp); for (int i = temp.length - 1; i >= 0; i--) { if (res < temp[i]) { res += temp[i]; } else { res *= 2; } } System.out.println(res); } }
全部评论
(2) 回帖