P1982 小朋友的数字
題目描述
有 n 個(gè)小朋友排成一列。每個(gè)小朋友手上都有一個(gè)數(shù)字,這個(gè)數(shù)字可正可負(fù)。規(guī)定每個(gè)
小朋友的特征值等于排在他前面(包括他本人)的小朋友中連續(xù)若干個(gè)(最少有一個(gè))小朋
友手上的數(shù)字之和的最大值。
作為這些小朋友的老師,你需要給每個(gè)小朋友一個(gè)分?jǐn)?shù),分?jǐn)?shù)是這樣規(guī)定的:第一個(gè)小
朋友的分?jǐn)?shù)是他的特征值,其它小朋友的分?jǐn)?shù)為排在他前面的所有小朋友中(不包括他本人),
小朋友分?jǐn)?shù)加上其特征值的最大值。
請(qǐng)計(jì)算所有小朋友分?jǐn)?shù)的最大值,輸出時(shí)保持最大值的符號(hào),將其絕對(duì)值對(duì) p 取模后
輸出。
輸入輸出格式
輸入格式:
?
輸入文件為 number.in。
第一行包含兩個(gè)正整數(shù) n、p,之間用一個(gè)空格隔開(kāi)。
第二行包含 n 個(gè)數(shù),每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開(kāi),表示每個(gè)小朋友手上的數(shù)字。
?
輸出格式:
?
輸出文件名為 number.out。
輸出只有一行,包含一個(gè)整數(shù),表示最大分?jǐn)?shù)對(duì) p 取模的結(jié)果。
?
輸入輸出樣例
輸入樣例#1:5 997 1 2 3 4 5 輸出樣例#1:
21 輸入樣例#2:
5 7 -1 -1 -1 -1 -1 輸出樣例#2:
-1
說(shuō)明
Case 1:
小朋友的特征值分別為 1、3、6、10、15,分?jǐn)?shù)分別為 1、2、5、11、21,最大值 21
對(duì) 997 的模是 21。
Case 2:
小朋友的特征值分別為-1、-1、-1、-1、-1,分?jǐn)?shù)分別為-1、-2、-2、-2、-2,最大值
-1 對(duì) 7 的模為-1,輸出-1。
對(duì)于 50%的數(shù)據(jù),1 ≤ n ≤ 1,000,1 ≤ p ≤ 1,000所有數(shù)字的絕對(duì)值不超過(guò) 1000;
對(duì)于 100%的數(shù)據(jù),1 ≤ n ≤ 1,000,000,1 ≤ p ≤ 10^9,其他數(shù)字的絕對(duì)值均不超過(guò) 10^9
?
?
我們用dptz表示特征的最大值。
用dpfs表示分?jǐn)?shù)的最大值
?
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;// 當(dāng)前最大字段和 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 }?
轉(zhuǎn)載于:https://www.cnblogs.com/zwfymqz/p/7125046.html
總結(jié)
以上是生活随笔為你收集整理的P1982 小朋友的数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++------------提取文件中
- 下一篇: java游戏开发基础Swing之JRad