洛谷 P2672 推銷員 貪心

2021-09-28 22:06:48 字數 1617 閱讀 7098

題目描述

阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第ii家住戶到入口的距離為s

is_i

si​ 公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶推銷產品,然後再原路走出去。阿明每走1公尺就會積累1點疲勞值,向第i家住戶推銷產品會積累a

ia_i

ai​​點疲勞值。阿明是工作狂,他想知道,對於不同的x,在不走多餘的路的前提下,他最多可以積累多少點疲勞值。

輸入格式

第一行有乙個正整數n,表示螺絲街住戶的數量。

接下來的一行有n個正整數,其中第i個整數s

is_i

si​ 表示第i家住戶到入口的距離。資料保證s1≤

s2≤…

≤s

n<10

8s_1≤s_2≤…≤s_n<10^8

s1​≤s2

​≤…≤

sn​<10

8 。接下來的一行有n個正整數,其中第i個整數a

ia_i

ai​表示向第ii戶住戶推銷產品會積累的疲勞值。資料保證a

i<

1000

a_i<1000

ai​<10

00。輸出格式

輸出nn行,每行乙個正整數,第i行整數表示當x=ix=i時,阿明最多積累的疲勞值。

思路:貪心,選取i

ii個客戶時的最大疲勞值在兩種情況中取最大值即可:(1)選取最大的i

ii個a

ja_j

aj​,此時距離也可以確定下來;(2)選取最大的i−1

i-1i−

1個aj

a_jaj

​和11

1個最大的ak+

2∗sk

a_k+2*s_k

ak​+2∗

sk​,即用情況(1)下最小的那個a

ja_j

aj​換取乙個距離更遠的。

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+5;

struct node

}a[maxn]

;int l[maxn]

,r[maxn]

,sum[maxn]

;int n;

intmain()

for(

int i=n;i>=

1;i--

) r[i]

=max

(r[i+1]

,2*a[i]

.s+a[i]

.v);

for(

int i=

1;i<=n;i++

)printf

("%d\n"

,max

(sum[i]

+l[i]

,sum[i-1]

+r[i]))

;return0;

}

洛谷 P2672 推銷員

阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第i家住戶到入口的距離為si公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶推銷產品,然...

洛谷 P2672 推銷員

題目描述 阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第i家住戶到入口的距離為si公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶推...

洛谷 p2672 推銷員

推銷員 題目鏈結 好了為了湊字數先把題目複製一下 好了題解第一篇正解 首先輸入,莫得什麼好說的 scanf d n for int i 1 i n i scanf d a i s for int i 1 i n i scanf d a i v 然後是思路 對於每乙個x,我們有兩種選擇 選擇前x個a值...