zoukankan      html  css  js  c++  java
  • 推销员

    洛咕

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

    分析:贪心.对于每一个(x),答案一定是在 最大的(x)个疲劳值加上其中最远的距离乘2 与 最大的(x-1)个疲劳值加上最远的距离乘2 之中取(max).

    所以我们只要预处理出以下几个东西,就可以做到每次(O(1))回答询问了.将所有住户按照疲劳值(val_i)从大到小排序之后,记录(sum[i])表示前i个住户疲劳值的和,(far[i])表示前i个住户中最远的距离,(g[i])表示第i到第n个住户中(2*dis+val)的最大值.

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #define ll long long
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    const int N=1e5+5;
    int sum[N],far[N],g[N];
    struct ppx{int dis,val;}a[N];
    inline bool cmp(ppx x,ppx y){return x.val>y.val;}
    int main(){
    	int n=read();
    	for(int i=1;i<=n;++i)a[i].dis=read();
    	for(int i=1;i<=n;++i)a[i].val=read();
    	sort(a+1,a+n+1,cmp);
    	for(int i=1;i<=n;++i)sum[i]=sum[i-1]+a[i].val;
    	for(int i=1;i<=n;++i)far[i]=max(far[i-1],a[i].dis);
    	for(int i=n;i>=1;--i)g[i]=max(g[i+1],2*a[i].dis+a[i].val);
    	for(int i=1;i<=n;++i)printf("%d
    ",max(2*far[i]+sum[i],sum[i-1]+g[i]));
        return 0;
    }
    
    
  • 相关阅读:
    redis事务详解
    redis之管道
    redis持久化
    redis之通信协议
    redis之线程IO模型
    Google、Azure、阿里云、RedHat…全球的 K8s 圈大佬聚在一起要聊啥?
    开箱即用,Knative 给您极致的容器 Serverless 体验
    2020 年 HackerEarth 调查:Go 语言成为最受欢迎的语言(内含 Go 语言图谱下载)
    Serverless 选型:深度解读 Serverless 架构及平台选择
    阿里云容器服务发布 Knative 托管服务 | 云原生生态周报 Vol. 49
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11623372.html
Copyright © 2011-2022 走看看