8.26阿里笔试第二题

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int T = sc.nextInt();
    while(T-- > 0) {
        int n = sc.nextInt();//怪物
        int m = sc.nextInt();//耐久度
        int[][] arr = new int[n][2];
        for(int i = 0; i < n; i++) {
            arr[i][0] = sc.nextInt();//消耗耐久度
            arr[i][1] = sc.nextInt();//掉落武器数量
        }
        Arrays.sort(arr, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) {
                return o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0];
            }
        });
        if(m < arr[0][0]) {
            System.out.print(0 + " ");
            System.out.println(0);
        } else {
            int can = arr[0][1];
            int resm = m - arr[0][0];
            int res = 1;
            int i = 1;
            for(; i < n; i++) {
                if(resm < arr[i][0] && can <= 0) break;
                if(can > 0) {
                    can = can - 1;
                } else {
                    resm = resm - arr[i][0];
                }
                can = can + arr[i][1];
            }
            resm = m - resm;
            System.out.print(i + " ");
            System.out.println(resm);
        }

    }
}
第二题还不及判题,本地测试是对的(可能用例不够),大伙看看是对吗?
思路:先对每件武器消耗耐久度按升序排列,耐久度相同就按掉落的武器数降序排列,最后使用贪心得出结果。
#阿里巴巴##笔试题目#
全部评论
我的dp,本地测试过了,但是也来不及提交,这是主要代码,返回每组数据的结果 static int[] solution(int[] w, int[] v, int V) {         int len = w.length;         int[] dp = new int[V + 1];         int left;         int n;         for(int i = 0; i < len; ++i) {             for(int j = V; j >= w[i]; --j) {                 left = v[i];                 n = 0;                 for(int k = 0; k < len; ++k) {                     if(k != i && left > 0) {                         ++n;                         left--;                         left += v[k];                     }                 }                 dp[j] = Math.max(dp[j], n + 1);             }         }         int[] ans = new int[2];         ans[1] = dp[V];         for(int i = 0; i <= V; ++i) {             if(dp[i] == ans[1]) {                 ans[0] = i;                 break;             }         }         return ans;     }
点赞 回复 分享
发布于 2020-08-26 10:12
楼主能描述一下题目吗🤣
点赞 回复 分享
发布于 2020-08-26 10:28
反例: 1 7 5 4 1 5 0 7 1 6 1 1 0 2 0 3 0 应该输出 5 5  你输出的是2 3
点赞 回复 分享
发布于 2020-08-26 13:04

相关推荐

头像
10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
点赞 3 评论
分享
牛客网
牛客企业服务