阿里2020/8/3笔试题(一)

阿里笔试共一个小时,两道编程题目,平台为牛客网。

没做出来,重在参与了。第一题有思路,但是后来经验证还是有漏洞,遂去牛客找大佬的思路,因此用本博客来记录一下打怪生涯。

第一题:有n个人,每人有对应的钱币,有m个房子,每个房子有对应的价值和舒适度。

每个人只能买一个房子,每个房子只能被一个人买,求最大的舒适度和。

思路:贪心算法,让每个人买能够买范围内舒适度最高的房子。需注意要让钱少的人优先买,不然可能会造成钱多的人把价格低但舒适度高的房子买走,导致钱少的人没钱买房子的现象。

Talk is cheap, show me the code.

    

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class ALiTest1 {
    public static void main(String[] args) {
        //读取数据
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();   //n为朋友的数量
        int m = sc.nextInt();   //m为房子的数量
        int[] moneyPerFriend = new int[n];  //记录每个朋友的金币数
        for (int i = 0; i < n; i++) {
            moneyPerFriend[i] = sc.nextInt();
        }
        List<int[]> houseAttr = new ArrayList<>();  //使用ArrayList来添加房子的属性
        for (int i = 0; i < m; i++) {
            int[] house = new int[2];
            house[0] = sc.nextInt();    //第一个属性为房子的价格
            house[1] = sc.nextInt();    //第二个属性为房子的舒适度
            houseAttr.add(house);
        }
        long comfortSum = 0;    //舒适度和,数据很大,用long来存储
        Arrays.sort(moneyPerFriend);    //按朋友的金币数排序
        for (int i = 0; i < n; i++) {
            int comfort = 0;    //对每个朋友来说,初始化舒适度为0
            int index = -1;     //用一个index来记录这个朋友最终买了哪套房子
            for (int j = 0; j < houseAttr.size(); j++) {
                if (moneyPerFriend[i] >= houseAttr.get(j)[1] && houseAttr.get(j)[0] >= comfort){
                    comfort = houseAttr.get(j)[0];
                    index = j;
                }
            }
            if (index != -1){
                houseAttr.remove(index);
            }
            comfortSum+=comfort;
        }
        sc.close();
        System.out.println(comfortSum);
    }
}

笔试题第二题会在之后记录。

代码还有很多可以优化的地方,只是将思路展现给大家,也用来记录自己打怪升级的过程。

猜你喜欢

转载自blog.csdn.net/DebugMyself/article/details/107822957
今日推荐