洛谷P1982 小朋友的數字 題解

2022-04-12 02:02:39 字數 2442 閱讀 5392

題目傳送

簡單地說,這題就是讓我們求前i個數的最大子串和和最值。

對於最大子串和,我們可以設乙個變數qian,表示以當前元素結尾的最大子串的子串和。若搜尋完第i-1個小朋友,現在看到第i個小朋友時,若qian大於0,就說明以第i-1個小朋友為結尾的最大子串和的值大於0,那麼讓這小朋友連上這個字串的話得到的子串和一定比讓這個小朋友獨自一人組成乙個子串得到的和要大,而且在這時第i個小朋友連上這個字串後得到的這個子串也是以第i個小朋友為結尾的和最大的子串;若qian小於0,那第i個小朋友就不如自己單獨組成乙個新的子串,這樣得來的子串和還要比讓這個小朋友連上之前的子串得到的子串和要大

。若qian大於目前搜尋到的所有子串的和中最大的和maxn還要大,就更細maxn。第i個小朋友的特徵值就是此時的maxn(注意,以第i個小朋友為結尾的子串不一定是前i個小朋友中組成的所有子串中子串和最大的子串)。

對於最值,我們要每次求第i個小朋友的分數時都把前面的小朋友分數加特徵值都掃一遍嗎?不用。我們只要維護乙個表示當前的前i-1個小朋友中最大的分數與特徵值的和的變數maxx就行了。

根據題目範圍,顯然小朋友的「手牌值」和特徵值都是在long long 型別以內的。對於分數也好像在long long 以內。但真的是這樣嗎?

我們使單位「1」等於109

(即小朋友最大可能的手牌值),看一下資料最大的情況,即有1000000個小朋友,每個小朋友手裡的牌值都是乙個「單位『1』」,列有下表:

小朋友編號12

3456

789...

1,000,000

手牌值(1:109)11

1111

111...

1特徵值(1:109)12

3456

789...

1,000,000

分數(1:109)12

471116

2229

37...

499999500001

499999500001*109=4.99999500001*1020,而long long的資料最大約9*1018,顯然會爆,怎麼辦?這裡是用兩個long long 型high和low用1015進製表示乙個數,即任意乙個不超過題意資料範圍內的數都可以用high*base+low表示(base=1015)。乙個普通的數x轉成這樣乙個數,只需high=x/base,low=x%base。相加的話注意進製就好。對於符號,我們只要保證high和low同號或high為0就行。同時發現,因為low的絕對值小於base,那麼如果low為負數,加上乙個base就變成正數了;如果low為正數,減去乙個base就變成負數了。

見ac**:

1 #include2 #include3 #include4 #include5

6using

namespace

std;78

long

long spe[1000001],num[1000001

],ans,mod,qian ;910

const

long

long

base=1000000000000000;11

12char

ch;13

14bool

f;15

16 inline long

long

read()

1725

26struct

lllpoi[1000001

],maxx;

2930 inline lll operator+(lll a,const lll &b)

3139

40 inline lll operator+(lll a,const

long

long

c)41

5253

inline lll max(lll a,lll b)

5460

61int

main()

6273 poi[1].low=spe[1]%base

;74 poi[1].high=spe[1]/base

;75 maxx=poi[1]+spe[1

];76

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

7781 maxx=poi[1

];82

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

83 maxx=max(maxx,poi[i]);

84 cout<

85return0;

86 }

有人說難題都是乙個個簡單的題疊加成的。對於很多題,其實我們只要把它分解成乙個個我們能解決的簡單的子問題,最後合併一下就行了。

洛谷P1982 小朋友的數字

有 n 個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面 包括他本人 的小朋友中連續若干個 最少有乙個 小朋友手上的數字之和的最大值。作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的 第乙個小朋友的分數是他的特徵值,其它小朋友的分...

題解 P1982 小朋友的數字

題目鏈結 題目大意 求 max 其中 f i max d j 表示區間 1,j 內的最大連續子段和 動態規劃 分析 看了題目題目大意,這題顯然還是挺水的吧.我們先看狀態 d 怎麼求 我們設 td i 表示以 i 結尾的最大連續子段和,那麼顯然 td i max td i 1 val i val i ...

P1982 小朋友的數字

有 nn個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面 包括他本人 的小朋友中連續若干個 最少有乙個 小朋友手上的數字之和的最大值。作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的 第乙個小朋友的分數是他的特徵值,其它小朋友的分...