• luogu P2672 推销员 |贪心


    题目描述

    阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第ii家住户到入口的距离为Si米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。

    阿明每走1米就会积累1点疲劳值,向第i家住户推销产品会积累Ai点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

    输入格式

    第一行有一个正整数N,表示螺丝街住户的数量。

    接下来的一行有N个正整数,其中第ii个整数Si


    表示第i家住户到入口的距离。数据保证 S1≤S2≤…≤Sn<10^8

    接下来的一行有N个正整数,其中第i个整数Ai

    表示向第i户住户推销产品会积累的疲劳值。数据保证Ai<1000

    输出格式

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


    贪心思路,两种方案
    1.取最大的x个a
    2.取最大的x-1个a,再取一个最大的2*s+a用来拉长距离

    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=1e5+10;
    #define int long long
    struct node{
    	int s,a;
    }e[N];
    inline bool cmp(node t1,node t2){
    	return t1.a>t2.a;
    }
    int n;
    int h[N];
    signed main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)scanf("%lld",&e[i].s);
    	for(int i=1;i<=n;i++)scanf("%lld",&e[i].a);
    	sort(e+1,e+n+1,cmp);
    	for(int i=n;i>=1;i--)h[i]=max(h[i+1],2*e[i].s+e[i].a);
    	int suma=0,Maxs=0;
    	for(int i=1;i<=n;i++){
    		suma+=e[i].a;
    		Maxs=max(Maxs,2*e[i].s);
    		printf("%lld
    ",max(suma+Maxs,suma-e[i].a+h[i]));
    	}
    }
    
  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/11838694.html
Copyright © 2020-2023  润新知