题解:P2672 [NOIP2015 普及组] 推销员
P2672 [NOIP2015 普及组] 推销员
原题传送门
更好的阅读体验
解题思路
先考虑暴力。观察样例可知,
再考虑优化。如果当前最远走到的距离是
那么我们就会有一个贪心的思路,如果从
这时可以想到,用两个大根堆分别维护当前
该做法时间复杂度
参考代码
#include<iostream>
#include<queue>
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int N=100005;
priority_queue<int> q1;
priority_queue<pii> q2;
int n,ans,now,maxx,maxn;
pii a[N],t;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].fi;//s
for(int i=1;i<=n;i++) cin>>a[i].se;//a
for(int i=1;i<=n;i++) q2.push(mp(2*a[i].fi+a[i].se,i));
q1.push(0);
for(int i=1;i<=n;i++){
now=maxn;
maxx=q1.top();
while(!q2.empty()){
t=q2.top();
if(a[t.se].fi>=a[maxn].fi||maxn==0) break;
q2.pop();
}
if(t.fi-2*a[maxn].fi>maxx&&!q2.empty()){
maxn=t.se;
maxx=t.fi-2*a[now].fi;
for(int j=now+1;j<maxn;j++) q1.push(a[j].se);
q2.pop();
}
else q1.pop();
ans+=maxx;
cout<<ans<<'\n';
}
return 0;
}
AC 记录