组装手机
题目描述
小欧是手机外壳供应商,小蕊是手机零件供应商。小欧已经生产了 n 个手机外壳,第 i 个手机外壳售价 ai 元,小蕊生产了 n 个手机零件,第 i 个手机零件售价 bi 元。
在组装手机中,一个手机外壳与一个手机零件可以组装成一个手机,手机的售价为手机外壳售价与手机零件售价之和。
他们需要选出一些外壳和零件,配对形成若干部手机,要求这些手机的售价全部相同。小欧想知道他们最多可以组装多少部手机?
输入描述
第一行一个整数 n (1 <= n <= 1000)
第二行 n 个整数 ai (1 <= ai <= 1000)
第三行 n 个整数 bi (1 <= bi <= 1000)
输出描述
一行一个整数,表示最大数量。
输入示例
4 1 2 3 4 1 2 4 5
输出示例
3
思路:
由于题目给出的n范围为1~1000,数a、b的范围也为1~1000,所以我们直接暴力模拟就能AC。
将a、b数组分别排序后计算相加最小值minNum,最大值maxNum,最终允许的手机售价就在这个区间内。
使用了两个hashMap记录数组各个元素对应的数量可以节省后续遍历的操作。
如果n过大无法暴力AC,本题可以考虑排序后使用双指针
import java.lang.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] ai = new int[n]; int[] bi = new int[n]; Map<Integer,Integer> aMap = new HashMap<>(); Map<Integer,Integer> bMap = new HashMap<>(); for(int i = 0;i<n;i++){ ai[i] = in.nextInt(); aMap.put(ai[i],aMap.getOrDefault(ai[i],0)+1); } for(int i = 0;i<n;i++){ bi[i] = in.nextInt(); bMap.put(bi[i],bMap.getOrDefault(bi[i],0)+1); } Arrays.sort(ai); Arrays.sort(bi); int maxNum = ai[n-1]+bi[n-1]; int minNum = ai[0]+bi[0]; int ans = 0; for(int i = minNum;i<=maxNum;i++){ int tmpNum = 0; for(int j = 1;j<=i-1;j++){ tmpNum += Math.min(aMap.getOrDefault(j,0),bMap.getOrDefault(i-j,0)); } ans = Math.max(ans,tmpNum); } System.out.println(ans); } }