洛谷P2672 NOIP2015普及組第四題

2021-08-18 01:16:49 字數 2012 閱讀 6254

題目描述

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

阿明每走1公尺就會積累1點疲勞值,向第i家住戶推銷產品會積累ai點疲勞值。阿明是工作狂,他想知道,對於不同的x,在不走多餘的路的前提下,他最多可以積累多少點疲勞值。

輸入格式:

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

接下來的一行有n個正整數,其中第i個整數si表示第i家住戶到入口的距離。資料保證s1≤s2≤…≤sn<10^8。

接下來的一行有n個正整數,其中第i個整數ai表示向第i戶住戶推銷產品會積累的疲勞值。資料保證ai<10^3。

輸出格式:

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

輸入樣例#1:

5
1 2 3 4 5
1 2 3 4 5

輸出樣例#1:

15
19
22
24
25

輸入樣例#2:

5
1 2 2 4 5
5 4 3 4 1

輸出樣例#2:

12
17
21
24
27

解題思路:

這道題目可以有兩種做法,一種是貪心,一種是線段樹。

貪心如何去做呢?首先,要按照每戶的疲勞度去從大到小排序,然後,逐個去搜尋,即可得到答案。

線段樹的話~~~這種模板,應該就用不著解釋了吧~~~

**:(請不要直接拷貝哦)

//貪心

#include #include struct pla[100005];

int maxx,j,k,ans;

using namespace std;

bool cmp(pl x,pl y)

int main()

ans+=maxx;

printf("%d\n",ans);

for (int i=1;i<=n;i++)

tree[400005];

int s[100005],a[100005];

int ans,now,last;

using namespace std;

inline void push_up(int x)

else

}inline void push_down(int x)

inline void build(int x,int l,int r)

build(x*2,l,tree[x].mid);

build(x*2+1,tree[x].mid+1,r);

push_up(x);

}inline void change(int x)

if (tree[x].l==tree[x].r)

if (tree[x].lazy) push_down(x);

change(x*2);

change(x*2+1);

push_up(x);

}inline void xg(int x)

if (now<=tree[x].mid) xg(x*2);

else xg(x*2+1);

push_up(x);

}int main()

xg(1);//將now刪除掉

}return 0;

}

普及組2015 洛谷 P2672 推銷員

題目 推銷員 思路 貪心。要取到最大的疲勞度只有兩種情況,一是全部取a最大的,二是取乙個遠的,再剩下的取a最大的。先關於a對於住戶從大到小排序。定義 sums i 從i到i之後,a 2 s的最大值 suma i 從1到i,2 s的最大值 sum i 從1到i的a之和預處理出這三個陣列,列舉x。考慮第...

洛谷 P2672 推銷員

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

洛谷 P2672 推銷員

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