阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。
螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。
螺絲街一共有n
nn家住戶,第i家住戶到入口的距離為s
is_i
si公尺。
由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。
阿明會從入口進入,依次向螺絲街的x家住戶推銷產品,然後再原路走出去。
阿明每走1
11公尺就會積累1
11點疲勞值,向第i
ii家住戶推銷產品會積累a
ia_i
ai點疲勞值。
阿明是工作狂,他想知道,對於不同的x
xx,在不走多餘的路的前提下,他最多可以積累多少點疲勞值。
輸入格式
第一行有乙個正整數n
nn,表示螺絲街住戶的數量。
接下來的一行有n
nn個正整數,其中第i
ii個整數s
is_i
si表示第i家住戶到入口的距離。資料保證s1≤
s2≤…
≤s
n<10
8s1≤s2≤…≤sn<10^8
s1≤s2≤
…≤sn
<10
8。接下來的一行有n
nn個正整數,其中第i
ii個整數a
ia_i
ai表示向第i戶住戶推銷產品會積累的疲勞值。資料保證a
i<10
3a_i<10^3
ai<10
3。輸出格式
輸出n行,每行乙個正整數,第i行整數表示當x=i
x=ix=
i時,阿明最多積累的疲勞值。
資料範圍
1 ≤n
≤105
1≤n≤10^5
1≤n≤10
5輸入樣例:
5輸出樣例:1 2 3 4 5
1 2 3 4 5
15輸入樣例分析:1922
2425
通過分析樣例可以發現,阿明向x
家住戶推銷產品的能積累最大疲勞值只有兩種情況:
推銷給a
ia_i
ai值最大的x
家
推銷給a
ia_i
ai值最大的x - 1
家,然後最後一家盡可能的遠離得遠
因此可以利用貪心思想,將所有住戶按照a
ia_i
ai從大到小排序。然後,為了方便計算,可以利用字首和的思想預處理出下列陣列:
那麼,向x
家推銷產品的最大疲勞值就是下面兩種情況的最大值:
推銷給a
ia_i
ai值最大的x
家,即s[i] + 2 * f[i]
推銷給a
ia_i
ai值最大的x - 1
家,然後最後一家盡可能的遠離得遠,即s[i - 1] + g[i]
預處理字首和陣列和求每個x
對應的最大花費都是線性的,所以演算法的瓶頸在於排序演算法,時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)。
#include
#include
#include
using
namespace std;
typedef pair<
int,
int> pii;
const
int n =
100010
;pii a[n]
;int s[n]
;//s[i]表示前i戶ai的和
int f[n]
;//表示前i戶si的最大值
int g[n]
;//表示i~n中2si + ai的最大值
intmain()
return0;
}
NOIP2015普及組T4 推銷員 優先佇列
做法 先來分析一下題目。從題目中的樣例,我們可以得到乙個猜想 後面的決策一定包含前面的決策。這個結論是可以證明的,證明過程這裡就不贅述了。因此,我們只需要分階段一步步在決策中新增住戶即可。對於某乙個決策,我們設離入口最遠的住戶編號是x,編號為i的住戶離入口的距離是s i 新增的疲勞值是a i 則要新...
NOIP2015普及組複賽A 推銷員
略方法就是把疲勞值從小到大排個序,然後從尾部開始乙個乙個取,當選到第i i 2 個時有2種取法 一是取,那麼x i的答案就是 n i 1,n 區間的疲勞值求和並加上其中最大距離的2倍 二是不取,那麼答案便是 n i 2,n 區間的疲勞值求和並加上 1,n i 區間中 疲勞值 距離的2倍 最大的乙個,...
NOIP 2015 普及組 初賽
noip 2015 普及組 初賽 疑難點 學習 感悟。本份試卷本人得分93,兩處錯誤,一錯在二 1.題,眼花了,多數了個資料3241 二錯在四 2.題 5 空,該空寫成rbound mid 1,這個錯誤在考試中是改正不了的,這是由本人解題方法決定的。也就是說該份試卷本人的極限是98。1.c.1000...