P3378 【模板】堆
题目描述
给定一个数列,初始为空,请支持下面三种操作:
- 给定一个整数 xx,请将 xx 加入到数列中。
- 输出数列中最小的数。
- 删除数列中最小的数(如果有多个数最小,只删除 11 个)。
输入格式
第一行是一个整数,表示操作的次数 nn。
接下来 nn 行,每行表示一次操作。每行首先有一个整数 opop 表示操作类型。
- 若 op = 1op=1,则后面有一个整数 xx,表示要将 xx 加入数列。
- 若 op = 2op=2,则表示要求输出数列中的最小数。
- 若 op = 3op=3,则表示删除数列中的最小数。如果有多个数最小,只删除 11 个。
输出格式
对于每个操作 22,输出一行一个整数表示答案。
输入输出样例
输入 #1复制
5 1 2 1 5 2 3 2
输出 #1复制
2 5
说明/提示
【数据规模与约定】
- 对于 30\%30% 的数据,保证 n \leq 15n≤15。
- 对于 70\%70% 的数据,保证 n \leq 10^4n≤104。
- 对于 100\%100% 的数据,保证 1 \leq n \leq 10^61≤n≤106,1 \leq x \lt 2^{31}1≤x<231,op \in \{1, 2, 3\}op∈{1,2,3}。
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >dui;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int m,x;
cin>>m;
if(m==1)
{
cin>>x;
dui.push(x);
}
else if(m==2)
{
cout<<dui.top()<<"\n";
}
else if(m==3)
{
dui.pop();
}
else
{
continue;
}
}
}
题解:堆的模板题,这里直接调用优先队列,利用C++中的指令处理输入的操作,即可完成。
继承的特性
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
-
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
-
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object
extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}