第一题:
由于每一次都是数组中的最小值和bj操作,因此我们可以维护一个小根堆来存储他的动态分数,那么每次操作只需要弹出小根堆的堆顶元素,并将值加上bj,然后将其与数组中最大值取max即可。
本题C++和Java选手需要注意:数据范围较大,需要开long long。
#include<bits/stdc++.h>
using namespace std;
const int N=1E5+10;
typedef long long ll;
ll n,m,a[N],b[N];
int main(){
cin>>n>>m;
priority_queue<ll,vector<ll>,greater<ll>>heap; //小根堆
ll res=0;
for(int i=0;i<n;i++){
cin>>a[i];
heap.push(a[i]);
res=max(res,a[i]);
}
for(int i=0;i<m;i++){
cin>>b[i];
ll score=heap.top();heap.pop();
res=max(res,score+b[i]);
heap.push(score+b[i]);
cout<<res<<endl;
}
return 0;
}
堆:priority_queue,有三个参数
class T:T是优先队列中存储的元素的类型。
class Container = vector<T>:Container是优先队列底层使用的存储结构,可以看出来,默认采用vector。
class Compare = less<typename Container::value_type> :Compar是定义优先队列中元素的比较方式的类。如果是小根堆则为greater,大根堆为less;less、greater二者为仿函数,即把类当作函数使用,本质上为类,内部重载了()运算符,所以可以当作函数。
其余操作,如push、pop、empty都差不多。
详细解释:
第二题:
感觉好复杂,没写出来。