zoukankan      html  css  js  c++  java
  • noip2015普及组 推销员

    5126 推销员

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

    阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第i家住户到入口的距离为Si米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。阿明每走1米就会积累1点疲劳值,向第i家住户推销产品会积累Ai点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

    输入描述 Input Description

    第一行有一个正整数N,表示螺丝街住户的数量。
    接下来的一行有N个正整数,其中第i个整数Si表示第i家住户到入口的距离。数据保证S1≤S2≤…≤Sn<10^8。
    接下来的一行有N个正整数,其中第i个整数Ai表示向第i户住户推销产品会积累的疲劳值。数据保证Ai<10^3。

    输出描述 Output Description

    输出N行,每行一个正整数,第i行整数表示当X=i时,阿明最多积累的疲劳值。

    样例输入 Sample Input

    【样例1】
    5
    1 2 3 4 5
    1 2 3 4 5

    【样例2】
    5
    1 2 2 4 5
    5 4 3 4 1

    样例输出 Sample Output

    【样例1】
    15
    19
    22
    24
    25

    【样例2】
    12
    17
    21
    24
    27

    数据范围及提示 Data Size & Hint

    1≤N≤100000

    /*
    x=i时找的人一定是x=i-1时找的人再添上一个
    用优先队列
    每一次弹出队首ans+队首的疲劳值
    入队规则在代码里 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #define maxn 100010
    #define maxx 10010
    using namespace std;
    int n,tot,ans,now,a[maxn],b[maxn];
    struct node
    {
        int w;
        int v;
        bool operator < (node x)const
        {
            return v<x.v;
        }
    }e[maxn],ha;
    priority_queue<node>q;
    int cmp(node x,node y)
    {
        if(x.w<y.w)return 1;
        if(x.w==y.w&&x.v>y.v)return 1;
        return 0;
    }
    int main()
    {
        int i,j,k;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
          scanf("%d",&e[i].w);
        for(i=1;i<=n;i++)
          scanf("%d",&e[i].v);
        sort(e+1,e+n+1,cmp);
        for(i=1;i<=n;i++)
        {
            if(e[i].w!=e[i-1].w)
            {
                tot++;
                b[tot]=i;
                //b记录房屋中第一个人即房屋疲劳值最大的(已按从大到小排序) 
                a[tot]=i;
            }
            else a[tot]=i;//a记录房屋中最后一个人 
        }
        ha.w=0;
        ha.v=0;
        q.push(ha);
        for(i=1;i<=n;i++)
        {
            ha=q.top();
            int mx=ha.v,p=now;
            //now现在到了哪个房屋 
            for(j=now+1;j<=tot;j++)//看后面的有没有比现在更优的 
            {
                int t=b[j];
                if(e[t].v+(e[t].w-e[now].w)*2>mx)
                {
                    mx=e[t].v+(e[t].w-e[now].w)*2;
                    p=j;//记录后面最优的在那个房屋 
                }
            }
            int t=b[p];
            e[t].v+=(e[t].w-e[now].w)*2;
            //路上走的路程加给疲劳值最大的人 其他人不需要再多走路 
            for(j=a[now]+1;j<=a[p];j++)
              q.push(e[j]);
            //p房屋中及之前的人全部进队他们都不需要在考虑走路的疲劳值 
            now=p;
            ha=q.top();//取最大 
            q.pop();
            ans+=ha.v;
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/dingmenghao/p/5811088.html
Copyright © 2011-2022 走看看