麻烦bobo老师帮我看下蓝桥杯的一个题目

麻烦bobo老师帮我看下蓝桥杯的一个题目

https://img1.sycdn.imooc.com//climg/61af53db098159b607050808.jpg

https://img1.sycdn.imooc.com//climg/61af53f00926218913690791.jpg

相关代码:

在网上也看了很多解法,感觉和自己的思路是一样的,为什么我这个过不去。。。。实在不解了,麻烦bobo老师帮我看下,谢谢bobo老师


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

你已经说了网上看到的解法和自己的思路一样了,所以问题可能就不在思路上了,而在具体实现上了。你贴给我一个错误用例,我是不知道你的问题是什么的。


请:

1)贴出具体 OJ 链接

2)贴出你的错误代码


方便我调试。


==========


我不确定你是不是真的理解了这个问题的思路。但是,sort 中的 compare,只需要按照每个学生的三个属性之和进行排序就可以了,即排序这样写即可:


Arrays.sort(student, new Comparator<int[]>() {
    public int compare(int[] student1, int[] student2) {
        return (student1[0] + student1[1] + student1[2]) - (student2[0] + student2[1] + student2[2]);
}});


另外,由于结果比较大,你的代码中的 sum 和 time 需要声明为 long。


我在你的代码的基础上修改可以 ac 的程序:


import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改import java.util.function.IntPredicate;
 
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[][] student = new int[n][3];
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < 3; j ++) {
                student[i][j] = scan.nextInt();
            }
        }
 
        // 排序方式有变动
        Arrays.sort(student, new Comparator<int[]>() {
            public int compare(int[] student1, int[] student2) {
                return (student1[0] + student1[1] + student1[2]) - (student2[0] + student2[1] + student2[2]);
        }});
        
        // sum 和 time 需要 long 类型
        long sum = 0;
        long[] time = new long[n];
        for(int i = 0; i < n; i ++) {
            if(i == 0) {
                time[0] = student[i][0] + student[i][1];
            }else {
                time[i] = time[i - 1] + student[i - 1][2] + student[i][0] + student[i][1];
            }
        }
        for(int i = 0; i < n; i ++) {
            sum += time[i];
        }
 
 
 
        //在此输入您的代码...
        scan.close();
        System.out.println(sum);
    }
}

继续加油!:)


  • 慕数据4371709 提问者 #1

    不好意思老师,我当时没贴。。

    这个是链接:https://www.lanqiao.cn/problems/1025/learning/

    代码:

    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.Scanner;
    //1:无需package
    //2: 类名必须Main, 不可修改import java.util.function.IntPredicate;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            int n = scan.nextInt();
            int[][] student = new int[n][3];
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < 3; j ++) {
                    student[i][j] = scan.nextInt();
                }
            }
    
            Arrays.sort(student, new Comparator<int[]>() {
                public int compare(int[] student1, int[] student2) {
                    if((student1[0] + student1[1] + student1[2]) == (student2[0] + student2[1] + student2[2])) {
                        return student1[0] + student1[1] - student2[0] - student2[1];
                    }else {
                        return student1[1] + student1[0] + student1[2] - student2[0] - student2[1] - student2[2];
                    }
    
                }
            });
            int sum = 0;
            int[] time = new int[n];
            for(int i = 0; i < n; i ++) {
                if(i == 0) {
                    time[0] = student[i][0] + student[i][1];
                }else {
                    time[i] = time[i - 1] + student[i - 1][2] + student[i][0] + student[i][1];
                }
            }
            for(int i = 0; i < n; i ++) {
                sum += time[i];
            }
    
    
    
            //在此输入您的代码...
            scan.close();
            System.out.println(sum);
        }
    }


    2021-12-08 09:16:12
  • liuyubobobo 回复 提问者 慕数据4371709 #2

    我更新在了原回答中。继续加油!:)

    2021-12-08 15:55:19
  • liuyubobobo 回复 提问者 慕数据4371709 #3

    哦,我看懂你的 compare 了。纸笔推一下,其实不用 if,不过挂上这个 if 也没有错。你的代码的核心问题是 sum 和 time 可能超出 int 的范围,需要使用 long

    2021-12-08 16:13:27
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师