洛谷P1982 小朋友的數字

2021-08-19 18:13:52 字數 1704 閱讀 9563

有 n 個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面(包括他本人)的小朋友中連續若干個(最少有乙個)小朋友手上的數字之和的最大值。

作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的:第乙個小朋友的分數是他的特徵值,其它小朋友的分數為排在他前面的所有小朋友中(不包括他本人),小朋友分數加上其特徵值的最大值。

請計算所有小朋友分數的最大值,輸出時保持最大值的符號,將其絕對值對 p 取模後輸出。

輸入格式:

輸入檔案為 number.in。

第一行包含兩個正整數 n、p,之間用乙個空格隔開。

第二行包含 n 個數,每兩個整數之間用乙個空格隔開,表示每個小朋友手上的數字。

輸出格式:

輸出檔名為 number.out。

輸出只有一行,包含乙個整數,表示最大分數對 p 取模的結果。

輸入樣例#1:

5 997
1 2 3 4 5

輸出樣例#1:

21

輸入樣例#2:

5 7
-1 -1 -1 -1 -1

輸出樣例#2:

-1

case 1:

小朋友的特徵值分別為 1、3、6、10、15,分數分別為 1、2、5、11、21,最大值 21

對 997 的模是 21。

case 2:

小朋友的特徵值分別為-1、-1、-1、-1、-1,分數分別為-1、-2、-2、-2、-2,最大值

-1 對 7 的模為-1,輸出-1。

對於 50%的資料,1 ≤ n ≤ 1,000,1 ≤ p ≤ 1,000所有數字的絕對值不超過 1000;

對於 100%的資料,1 ≤ n ≤ 1,000,000,1 ≤ p ≤ 10^9,其他數字的絕對值均不超過 10^9。

解題思路:

看到題目中的「連續若干個……的最大值」,就知道多半是用dp來做的了。看完題目,便用dp來做了啦~

本題的關鍵是,最終答案必定產生在第乙個位置或最後乙個位置。然後要注意做的過程中,不要讓答案超過10億,超過了就%p,先計算到i位置的最大欄位和,再計算每個小朋友的分數。知道了這些,這道題目就可以開始碼了。

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

#include #include long long a[1000005][3],n,p,maxn,x;//使用long long 以防爆表

bool bo=0;

using namespace std;

int main()

a[2][2]=a[1][0]*2;

if (a[2][2]>=a[1][2]) bo=1;

for (long long i=3;i<=n;i++)

if (a[i-1][0]<0) a[i][2]=a[i-1][2]; else//計算分數

if (bo) printf("%lld\n",a[n][2]%p); else

printf("%lld\n",a[1][2]%p);

return 0;

}

洛谷P1982 小朋友的數字 題解

題目傳送 簡單地說,這題就是讓我們求前i個數的最大子串和和最值。對於最大子串和,我們可以設乙個變數qian,表示以當前元素結尾的最大子串的子串和。若搜尋完第i 1個小朋友,現在看到第i個小朋友時,若qian大於0,就說明以第i 1個小朋友為結尾的最大子串和的值大於0,那麼讓這小朋友連上這個字串的話得...

P1982 小朋友的數字

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

題解 P1982 小朋友的數字

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