Part1
语言基础题
P1089 [NOIP 2004 提高组] 津津的储蓄计划
import java.util.Scanner;// P1089 [NOIP 2004 提高组] 津津的储蓄计划
public class P1089 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int[] budget = new int[12];for (int i = 0; i < 12; i++) {budget[i] = in.nextInt();}int money = 0;int bank_money = 0;for (int i = 0; i < 12; i++) {money += 300;if (money >= budget[i]) {money -= budget[i];int save_money = money / 100 * 100;money -= save_money;bank_money += save_money;} else {System.out.printf("-%d", i + 1);return;}}System.out.println((int) (bank_money * 1.2 + money));}
}
关于文件读取:
使用 Reader
的子类 BufferedReader
(读取大文件)
int[] budget = new int[12];File file = new File("src/input.txt");try(BufferedReader br = new BufferedReader(new FileReader(file))) {for (int i = 0; i < 12; i++) {budget[i]= Integer.parseInt(br.readLine());}} catch (Exception e) {};for (int i = 0; i < 12; i++) {System.out.println(budget[i]);}
P1307 [NOIP 2011 普及组] 数字反转
使用 StringBuilder
的reverse
然后
1.判断正负,负号拿掉
2.反转
3.找到 firstNonZero 第一个非负数字的索引
4.截取,只要后半段
import java.util.Scanner;
import java.util.Stack;// P1307 [NOIP 2011 普及组] 数字反转
public class P1307 {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s = in.nextLine();StringBuilder sb = new StringBuilder(s);boolean negative = sb.charAt(0) == '-';if (negative) {sb = sb.deleteCharAt(0);}sb = sb.reverse();// 去除前导0int firstNonZero = 0; // 第一个非零数字的索引while (sb.charAt(firstNonZero) == '0' && firstNonZero < sb.length()) {firstNonZero++;}String out;if (negative) {out = "-" + sb.substring(firstNonZero);} else {out = sb.substring(firstNonZero);}System.out.println(out);}
}
数组
P1047 [NOIP 2005 普及组] 校门外的树
正常做法(通过70%)(注意最后结果 +1,因为 0 到 l 有 l+1 个树):
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int l = scanner.nextInt();int[] map = new int[l];Arrays.fill(map,1); // 1 tree; 0 not treeint m = scanner.nextInt();for (int i = 0; i < m; i++) {int left = scanner.nextInt();int right = scanner.nextInt();for (int j = left; j <= right; j++) {map[j]=0;}}int res = 0;for (int i = 0; i < l; i++) {res+=map[i];}System.out.println(res+1);}
优化(多个区间操作 -> 差分数组)
差分数组 和 前缀和 是一对互逆运算:
- 前缀和:用于快速 计算 某个范围
[L, R]
内的和 - 差分数组:用于快速 修改 某个范围
[L, R]
内的值
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int l = scanner.nextInt();int[] map = new int[l+1];int[] d = new int[l+2]; // 差分数组 防止 d[right+1] 溢出Arrays.fill(map,1); // 1 tree; 0 not treeint m = scanner.nextInt();for (int i = 0; i < m; i++) {int left = scanner.nextInt();int right = scanner.nextInt();d[left]-=1;d[right+1]+=1;}// 计算前缀和map[0] = map[0] + d[0];for (int i = 1; i <= l; i++) {map[i]=map[i-1]+d[i];}// 统计int res =0;for (int i = 0; i <= l; i++) {if (map[i]>0)res++;}System.out.println(res);
}
P2141 [NOIP 2014 普及组] 珠心算测验
注意读题,是 有多少个数 在前
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();HashSet<Integer> hashSet = new HashSet<>();int[] nums = new int[n];for (int i = 0; i < n; i++)nums[i] = scanner.nextInt();for (int i = 0; i < n - 1; i++) {for (int j = i + 1; j < n; j++) {hashSet.add(nums[i] + nums[j]);}}int res = 0;for (int i = 0; i < n; i++) {if (hashSet.contains(nums[i])) res++;}System.out.println(res);
}