30 道单选题(60分),2 道编程题(40分),编程题都是 ACM 模式需要自己写输入输出,一共 2 小时
对角线上的邻居
时间限制: 3000MS
内存限制: 589824KB
题目描述
小明搬进了一个新的小区里,对里面的环境和住户都比较陌生,小明发现这个小区的房屋是一个网格型排列,所有房屋在一个网格状的地图上。小区一共有 n 户人家,我们假设每户人家的位置表示为(x,y)。小明觉得如果两家是邻居的话,他们的关系应该会更好一些。现在我们定义当两户人家处在相同的任意一个对角线上的时候,则两户人家为邻居。现在小明想要统计这样的邻居一共有多少对。
输入描述
第一行 1 个整数n,,表示有 n 户人家。
接下来 n 行,第 i 行包含两个整数,,,,表示第 i 户人家的位置为(,)。
输出描述
一行一个整数,表示有多少对邻居。
样例输入
5 3 4 4 5 5 6 4 7 3 8
样例输出
6
提示
对于样例输入,以下几对人家均为邻居
(3,4)与(4,5)
(3,4)与(5,6)
(4,5)与(5,6)
(5,6)与(4,7)
(5,6)与(3,8)
(4,7)与(3,8)
73%时间超限
import java.util.Scanner; // 73% 时间超限,尝试了一下使用boolean[][] flag = new boolean[n][n];用来记录是否判断过,结果直接 7% 内存超限。 public class jd1 { public static void main (String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] nums = new int[n][2]; for (int i = 0; i < n; i++) { nums[i][0] = sc.nextInt(); nums[i][1] = sc.nextInt(); } int count = 0; for (int i = 0; i < nums.length; i++) { for (int j = i+1; j < nums.length; j++) { if(Math.abs(nums[i][0] - nums[j][0]) == Math.abs(nums[j][1] - nums[i][1])){ count++; } } } System.out.println(count); } }
中庸的数
时间限制: 3000MS
内存限制: 589824KB
题目描述
有若干个数形成一个可重集合,它们中很多都想做一个中庸的数,即既不是集合中最大的(或之一),也不是集合中最小的(或之一)。显然,不可能满足所有数。好在还是有一些数并不介意这一点。你需要从这些数中选出一个可重的子集,该子集中介意成为最值的数都得到满足(指不能成为子集中的最值)。请计算可以取的最大可重子集的大小。
输入描述
第一行一个整数 n,1 <= n <= 100000
后面 n 行,每行两个整数 x, y,x <= 1000000000,y 为 0 或 1。x 表示该数的值,y 为 1 表示该数不介意成为最值,为 0 则表示介意。
输出描述
一个整数,表示可取的最大的子集大小
样例输入
5 4 1 2 0 8 1 9 0 5 0
样例输出
3
90%答案错误的代码
import java.util.Arrays; import java.util.Scanner; // 通过 90 % 答案错误 public class jd2 { public static void main (String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] nums = new int[n][2]; for (int i = 0; i < n; i++) { nums[i][0] = sc.nextInt(); nums[i][1] = sc.nextInt(); } Arrays.sort(nums, (a,b)-> a[0]-b[0]); int i = 0, j = nums.length - 1; for (; i < n; i++) { if(nums[i][1] == 1){ break; } } for (; j >= 0; j--){ if(nums[j][1] == 1){ break; } } System.out.println(Math.max(j - i + 1, 0)); } }
全部评论
(3) 回帖