NOIP2015 推销员

TM 

 

#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;
}

  

posted @ 2016-10-28 11:35  qilinart  阅读(337)  评论(0编辑  收藏  举报