有 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 ...