題目描述
阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有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家住戶推...