Open Ryanlyt opened 1 year ago
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d", &n);
priority_queue<int, vector<int>, greater<int>> heap; //用小根堆动态维护最小的值
while(n--){
int x;
scanf("%d", &x);
heap.push(x);
}
int res = 0;
while(heap.size() > 1){
int a = heap.top(); heap.pop();
int b = heap.top(); heap.pop();
res += a + b;
heap.push(a + b);
}
printf("%d", res);
return 0;
}
贪心
代码简单,证明难
区间问题
区间选点
1、将每个区间按右端点从小到大排序 2、从前往后依次枚举每个区间(如果当前区间中已经包含点,则直接pass;否则,选择当前区间的右端点)
最大不相交区间数量
区间分组
什么时候考虑左端点,什么时候右端点:经验、积累
动态的维护最小值:可以用小根堆(优先队列)来做
区间覆盖
1、将所有区间按左端点从小到大排序 2、从前往后依次枚举每个区间,在所有能覆盖start的区间中,选择一个右端点最大的区间,并把start更新成右端点的的最大值