P1982 小朋友的数字
題目描述
有 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
?
?
我們用dptz表示特征的最大值。
用dpfs表示分數的最大值
?
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<algorithm> 7 #define lli long long int 8 using namespace std; 9 const lli MAXN=1000001; 10 void read(lli &n) 11 { 12 char c='+';lli x=0,flag=1; 13 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=-1;} 14 while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();} 15 n=x*flag; 16 } 17 lli n,mod; 18 lli dptz[MAXN]; 19 lli dpfs[MAXN]; 20 lli a[MAXN]; 21 lli now=0;// 當前最大字段和 22 lli ans=-1270000; 23 int main() 24 { 25 read(n);read(mod); 26 for(lli i=1;i<=n;i++) 27 read(a[i]); 28 dptz[1]=a[1]; 29 for(lli i=1;i<=n;i++) 30 { 31 now+=a[i]; 32 dptz[i]=now; 33 if(now<0) 34 now=0; 35 } 36 for(lli i=2;i<=n;i++) 37 dptz[i]=max(dptz[i],dptz[i-1]); 38 dpfs[1]=dptz[1]; 39 dpfs[2]=dpfs[1]+dptz[1]; 40 bool flag=0; 41 for(lli i=3;i<=n;i++) 42 { 43 dpfs[i]=dpfs[i-1]; 44 if(dptz[i-1]>0) 45 dpfs[i]+=dptz[i-1]; 46 if(dpfs[i]>dpfs[1])flag=1; 47 if(flag==1) 48 dpfs[i]=dpfs[i]%mod; 49 } 50 if(flag==1) 51 printf("%lld",dpfs[n]); 52 else 53 printf("%lld",dpfs[1]); 54 return 0; 55 }?
轉載于:https://www.cnblogs.com/zwfymqz/p/7125046.html
總結
以上是生活随笔為你收集整理的P1982 小朋友的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++------------提取文件中
- 下一篇: java游戏开发基础Swing之JRad