NOIP2015 推销员
#include<bits/stdc++.h> using namespace std; const int N=100010; int n,s[N],p[N],x[N],t; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&s[i]); for(int i=1;i<=n;i++)scanf("%d",&p[i]),p[i]+=2*s[i]; for(int k=0;k<n;){ int j=k; k=max_element(p+k+1,p+n+1)-p; x[++t]=p[k]-2*s[j]; for(int i=j+1;i<k;i++)x[++t]=p[i]-2*s[i]; } sort(x+1,x+n+1,greater<int>()); t=0; for(int i=1;i<=n;i++){t+=x[i];cout<<t<<endl;} return 0; }
#include<bits/stdc++.h> using namespace std; const int N=100010; int n,s[N],p[N],x; priority_queue<int> q; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&s[i]); for(int i=1;i<=n;i++)scanf("%d",&p[i]),p[i]+=2*s[i]; for(int k=0;k<n;){ int j=k; k=max_element(p+k+1,p+n+1)-p; q.push(p[k]-2*s[j]); for(int i=j+1;i<k;i++)q.push(p[i]-2*s[i]); } while(!q.empty()){int t=q.top();x+=t;printf("%d\n",x);q.pop();} return 0; }
#include<cstdio> #include<queue> using namespace std; const int N=100010; struct node{ int s,v;}h[N]; priority_queue<int> q; int n,x; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&h[i].s); for(int i=1;i<=n;i++)scanf("%d",&h[i].v); int k=0; h[0].s=h[0].v=0; for(;;){ int mx=-1,j=k; for(int i=k+1;i<=n;i++) if(2*(h[i].s-h[j].s)+h[i].v>mx)mx=2*(h[i].s-h[j].s)+h[i].v,k=i; q.push(mx); for(int i=j+1;i<k;i++)q.push(h[i].v); if(k==n)break; } x=0; while(!q.empty()){int t=q.top();x+=t;printf("%d\n",x);q.pop();} return 0; }
#include<cstdio> #include<queue> using namespace std; const int N=100010; struct node{ int s,v; bool operator < (node a)const{ return v<a.v;} }h[N],s; priority_queue<node> q; int n,x; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&h[i].s); for(int i=1;i<=n;i++)scanf("%d",&h[i].v); s.s=s.v=0; q.push(s); int now=0,mx=0; for(int i=1;i<=n;i++){ int next=now; s=q.top(); mx=s.v; for(int j=now+1;j<=n;j++)//寻找now以后的最优房屋 if(h[j].v+(h[j].s-h[now].s)*2>mx){ mx=h[j].v+(h[j].s-h[now].s)*2; next=j; } h[next].v+=(h[next].s-h[now].s)*2;//更新 if(now!=next)q.push(h[next]);//入队 for(int j=now+1;j<next;j++)//now到next之间的房屋入队 q.push(h[j]); s=q.top();//弹出堆顶 x+=s.v;//加入答案 q.pop(); printf("%d\n",x);//输出 now=next;//now=next继续寻找最优值 } return 0; }