原题链接:信息学奥赛一本通T1236-区间合并
解题思路:
注意事项:
参考代码:
import java.util.*; // 导入Java的util包,它包含了很多有用的数据结构和工具类 public class Main { // 定义一个名为Main的公共类 static class Pair implements Comparable<Pair> { // 在Main类内部定义一个静态内部类Pair,并实现Comparable接口以便排序 int l, r; // Pair类有两个整数成员变量l和r,代表一个区间的左右端点 public Pair(int l, int r) { // Pair类的构造函数,用于初始化l和r this.l = l; // 使用this关键字明确指定我们正在设置的是实例变量l this.r = r; // 使用this关键字明确指定我们正在设置的是实例变量r } @Override // 重写Comparable接口的compareTo方法,以便我们可以对Pair对象进行排序 public int compareTo(Pair other) { // compareTo方法接收一个Pair类型的参数other,用于与当前对象进行比较 return Integer.compare(this.l, other.l); // 使用Integer类的compare方法比较当前对象的l成员变量和other对象的l成员变量,并返回比较结果 } } public static void main(String[] args) { // 主函数,程序执行的入口点 Scanner sc = new Scanner(System.in); // 创建一个Scanner对象sc,用于从标准输入读取数据 int n = sc.nextInt(); // 读取一个整数n,代表区间的数量 ArrayList<Pair> lis = new ArrayList<>(); // 创建一个ArrayList对象lis,用于存储Pair对象(即区间) for (int i = 0; i < n; i++) { // 使用for循环读取n个区间,并将它们添加到lis中 int l = sc.nextInt(); // 读取一个整数l,代表区间的左端点 int r = sc.nextInt(); // 读取一个整数r,代表区间的右端点 lis.add(new Pair(l, r)); // 创建一个新的Pair对象(即一个新的区间),并将其添加到lis中 } Collections.sort(lis); // 使用Collections类的sort方法对lis进行排序(根据Pair对象的l成员变量进行升序排序) Pair lisSorted = lis.get(0); // 获取排序后的lis中的第一个Pair对象(即左端点最小的区间),并将其存储在lisSorted中 for (int i = 1; i < n; i++) { // 遍历lis中剩余的Pair对象(即区间) if (lis.get(i).l <= lisSorted.r) { // 如果当前区间的左端点小于等于lisSorted区间的右端点,说明它们可以合并 lisSorted.r = Math.max(lis.get(i).r, lisSorted.r); // 更新lisSorted区间的右端点,使其等于当前区间和lisSorted区间中右端点较大的那个 } else { // 如果当前区间的左端点大于lisSorted区间的右端点,说明它们不能合并,直接输出"no"并结束程序执行 System.out.println("no"); // 输出"no"表示无法合并所有区间为一个区间 return; // 结束主函数的执行(即结束程序的执行) } } System.out.println(lisSorted.l + " " + lisSorted.r); // 如果所有区间都可以合并为一个区间,则输出合并后的区间的左右端点(即lisSorted的l和r成员变量)作为结果 } }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复