NOIP2015普及組複賽T4 推銷員

2021-10-10 01:18:55 字數 2218 閱讀 7787

阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。

螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。

螺絲街一共有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...