一些神仙题

灭虫

题目链接
【问题描述】
你需要在一条无限长的道路上喷洒杀虫剂。
在这条道路上,总共有 N 个投放点,其中第 i 个投放点在数轴上坐标 pi 处。在每一
个投放点,你可以选择往左喷洒或往右喷洒。但是由于风向和地理环境的影响,向左喷洒和
向右喷洒的效果不一定相同。具体来说,在一个位置向左喷洒,可以覆盖 [pi - li, pi] 这一段
区域,而向右喷洒可以覆盖 [pi, pi + ri] 这一段区域。
请你决定每个投放点是向左喷洒还是向右喷洒,来使得被杀虫剂覆盖的路段长度和最大。
【输入】
第一行 N。
接下来 N 行,每行 pi, li, ri。
【输出】
输出最大的被杀虫剂覆盖的长度和。

Input Output
4
1 2 2
3 3 3
4 3 3
6 2 2
Output
9

样例说明
让第一个和第三个投放点向左喷洒,其他投放点向右喷洒。
这样能覆盖的区域是 [-1,8],总长度为 9。
【数据说明】
对于测试点 1、 2, N≤ 15;
对于测试点 3、 4, N≤ 3,000, ri = 0;
对于测试点 5、 6, N≤ 30;
对于测试点 7、 8, N≤ 300;
对于测试点 9、 10, N≤ 3,000;
保证 pi, li, ri ≤ 10^9。
Code

#include<bits/stdc++.h>
using namespace std;
const int N = 3010, inf = 1e9 + 7;
int n;
struct node {
    int p, l, r;
    bool operator < (const node &z) const {
        return p < z.p;
    }
} a[N];
int b[N * 3], tot, f[N][N * 3], id[N * 3];
int main() {
    //freopen("kill.in", "r", stdin);
    //freopen("kill.out", "w", stdout);
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d%d%d", &a[i].p, &a[i].l, &a[i].r);
        a[i].l = a[i].p - a[i].l; a[i].r = a[i].p + a[i].r;
        b[++tot] = a[i].p; b[++tot] = a[i].l; b[++tot] = a[i].r;
    }
    sort(b + 1, b + 1 + tot); tot = unique(b + 1, b + 1 + tot) - b - 1;
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i++) {
        a[i].p = lower_bound(b + 1, b + 1 + tot, a[i].p) - b;
        a[i].l = lower_bound(b + 1, b + 1 + tot, a[i].l) - b;
        a[i].r = lower_bound(b + 1, b + 1 + tot, a[i].r) - b;
        id[a[i].p] = i;
    }
    //f[i][j]表示前i个区间,贡献最右点小于等于j
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= tot; j++) f[i][j] = f[i - 1][j];
        for (int j = a[i].l + 1; j <= a[i].p; j++) 
            f[i][j] = max(f[i][j], f[i][j - 1] + b[j] - b[j - 1]);
        //i区间贡献(k,j]
        int mx = f[i - 1][a[i].p];
        for (int j = a[i].p + 1; j <= a[i].r; j++) {
            f[i][j] = max(f[i][j], mx + b[j] - b[a[i].p]);
            //i区间贡献(a[i].p,j]
            if (id[j] && a[id[j]].l < a[i].p) mx = max(mx, f[i - 1][a[id[j]].l] + b[a[i].p] - b[a[id[j]].l]);
            //相交
        }
        for (int j = 2; j <= tot; j++) f[i][j] = max(f[i][j], f[i][j - 1]);
    }
    printf("%d\n", f[n][tot]);
    return 0;
} 

转载于:https://www.cnblogs.com/zzy2005/p/11565225.html

<think>嗯,用户让我介绍一下Java面向对象程序设计的面试。首先,我需要确定用户的需求。他们可能在准备Java相关的面试,需要了解常见的面试目,尤其是面向对象的部分。用户可能有一定的Java基础,但想系统复习关键概念,或者他们可能刚开始学习,想通过面试来巩固知识。 接下来,我得考虑常见的OOP面试通常包括哪些内容。首先肯定是OOP的四大特性:封装、继承、多态和抽象。然后可能会有具体的Java实现,比如抽象类与接口的区别,重载和重写的区别,还有关键字如final、static的作用。另外,设计模式中的单例模式、工厂模式也是常考点,还有异常处理、集合框架等可能也会涉及。 用户可能需要分门别类的目示例,所以组织答案的结构很重要。应该分点列出各个主,每个主下给出问和解答。这样结构清晰,用户容易理解。同时,要确保回答准确,避免错误,比如多态的具体实现方式,动态绑定和静态绑定的区别,这些细节不能出错。 另外,需要注意用户提到的系统级指令,比如数学表达式用$...$,但这里可能用不上。但用户特别提到使用中文回答,所以必须保证语言准确流畅。还要注意LaTeX的正确使用,如果有代码示例的话,可能需要用代码块,但用户没有特别要求代码格式,所以可能用文字描述即可。 可能还需要考虑用户对某些概念的深入程度。比如在单例模式中,双重检查锁定的问,以及volatile关键字的作用,这些高级内容是否要包括进去。如果用户是中级或高级开发者,这些细节很重要,但如果是初学者,可能只需要基本的懒汉和饿汉模式。所以可能需要平衡,给出常见的问和解答,同时适当深入一些典型例子。 另外,集合框架中的ArrayList和LinkedList的区别,HashMap的工作原理,包括JDK1.8之后的红黑树优化,这些也是高频问。需要准确解释它们的底层实现和适用场景。 异常处理部分,检查异常和非检查异常的区别,以及如何处理,可能也是常问的问。还有自定义异常的应用场景,需要简明扼要地说明。 设计模式方面,除了单例和工厂,可能还有观察者模式、策略模式等,但考虑到面试常见度,单例和工厂模式更为基础,应该优先介绍。 在解答问时,需要确保正确性。例如,多态的实现方式除了继承和接口,还有方法重写,以及父类引用指向子类对象。动态绑定是指在运行时确定方法的具体实现,而静态绑定是在编译时,比如private和final方法。 此外,要避免常见的错误,比如抽象类可以有构造方法,但不能实例化,接口的默认方法在Java 8后的变化,这些都需要准确描述。 可能还需要考虑用户是否需要代码示例,但根据用户的要求,没有特别提到代码,所以可能以文字描述为主,但必要时可以提到代码结构,比如单例模式的双重检查锁定写法。 最后,总结部分应该提示用户如果需要更深入的目或解析,可以进一步询问,这样能促进互动,解决用户的潜在需求。</think>以下是一些常见的Java面向对象程序设计面试及解析,按核心知识点分类整理: --- ### 一、面向对象基础 1. **面向对象的四大特性是什么?** - **封装**:隐藏对象内部状态,通过方法控制访问权限(如`private`字段 + `getter/setter`)。 - **继承**:子类复用父类属性和方法(`extends`关键字),实现代码复用。 - **多态**:同一方法在不同对象中有不同行为(通过方法重写、接口实现、父类引用指向子类对象)。 - **抽象**:通过抽象类(`abstract class`)或接口(`interface`)定义规范,隐藏实现细节。 2. **抽象类与接口的区别?** - 抽象类可以有构造方法,接口不能; - 抽象类可以有普通字段,接口字段默认`public static final`; - 抽象类单继承,接口可多实现; - Java 8后接口支持`default`方法,Java 9支持`private`方法。 --- ### 二、核心语法与特性 3. **`final`关键字的作用?** - 修饰类:不可继承; - 修饰方法:不可重写; - 修饰变量:值不可变(基本类型值不可变,对象类型引用不可变)。 4. **重载(Overload)与重写(Override)的区别?** - **重载**:同一类中方法名相同,参数列表不同(返回值类型可不同); - **重写**:子类覆盖父类方法,方法名、参数列表、返回值类型必须一致,访问权限不能更严格。 5. **什么是静态绑定和动态绑定?** - **静态绑定**:编译时确定方法调用(如`private`、`final`、`static`方法); - **动态绑定**:运行时根据对象类型确定方法(多态的基础)。 --- ### 三、设计模式与设计原则 6. **手写单例模式(要求线程安全)** ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` - **双重检查锁定** + `volatile`防止指令重排序。 7. **工厂模式的应用场景?** - 解耦对象创建与使用(如`Calendar.getInstance()`); - 统一管理复杂对象的创建逻辑。 --- ### 四、集合框架 8. **ArrayList与LinkedList的区别?** - **ArrayList**:基于动态数组,随机访问快($O(1)$),增删慢(需移动元素); - **LinkedList**:基于双向链表,增删快($O(1)$),随机访问慢($O(n)$)。 9. **HashMap的工作原理?** - 基于数组+链表/红黑树(JDK1.8后); - 通过`hashCode()`计算桶位置,解决哈希冲突使用链地址法; - 当链表长度≥8且数组长度≥64时,链表转为红黑树。 --- ### 五、异常处理 10. **检查异常(Checked Exception)与非检查异常(Unchecked Exception)的区别?** - **检查异常**:必须显式处理(如`IOException`),编译时检查; - **非检查异常**:`RuntimeException`及其子类(如`NullPointerException`),无需强制处理。 --- ### 六、进阶问 11. **如何实现深拷贝?** - 实现`Cloneable`接口并重写`clone()`方法,递归复制所有引用类型字段; - 使用序列化/反序列化(如`ObjectOutputStream`)。 12. **Java内存模型中堆和栈的区别?** - **堆**:存储对象实例,线程共享,GC主要区域; - **栈**:存储局部变量和方法调用,线程私有,生命周期与线程同步。 --- ### 总结 以上问覆盖了Java OOP的核心考点。实际面试中需结合代码示例和实际场景分析,建议深入理解设计原则(如SOLID)和JVM底层机制(如类加载、内存管理)。是否需要进一步解析某个知识点?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值