23年oppo提前批B组笔试真题-组装手机

组装手机

题目描述

小欧是手机外壳供应商,小蕊是手机零件供应商。小欧已经生产了 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);
    }
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值