Wannafly挑战赛15_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
题意:
思路:
经典中的经典中的经典
还是一样双指针把可行解放入DS中,然后求最优解
值得注意的是,我们说的双指针的单调性,指的是 j 指针前面所有元素都能满足 ai 以及 ai 以后这个条件
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=998244353;
const int Inf=0x3f3f3f3f;
struct ty{
int num,cost;
}p[mxn];
int N,M;
int a[mxn];
bool cmp(ty x,ty y){
return x.num>y.num;
}
void solve(){
cin>>N>>M;
for(int i=1;i<=N;i++) cin>>a[i];
for(int i=1;i<=M;i++) cin>>p[i].num>>p[i].cost;
sort(a+1,a+1+N,greater<int>());
sort(p+1,p+1+M,cmp);
int j=1;
int ans=0;
priority_queue<int,vector<int>,greater<int> > Q;
for(int i=1;i<=N;i++){
while(j<=M&&a[i]<=p[j].num){
Q.push(p[j++].cost);
}
if(Q.size()){
ans+=Q.top();
Q.pop();
}else{
cout<<-1<<'\n';
return;
}
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}