P1982 小朋友的数字
P1982 小朋友的数字
题解
注意要开long long 啊
注意这题过程中也要mod一下,不然会爆炸
首先理解一下题意:
1.初始状态,每个小朋友会得到一个数字(你作为老师,你给的)
2.特征值:(题目规定了)
规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。
Ps:隐含条件就是说,第一个小朋友的特征值等于你给的数字
3.分数:(题目规定了)
第一个小朋友的分数是他的特征值
其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。
解释一下就是:
从第一个小朋友开始,到当前小朋友的前一个小朋友
对于每一个小朋友,把他的特征值和分数加起来,得到一个新数
当前小盆友的分数就是这些新数中的最大值
理解一下取模:
由于计算机取模和人类取模不一样,这个描述就代表可以计算机直接取模
计算机取模:负数取模后为负数
人类取模:负数取模后为正数
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; const long long minn=-0x7fffffff; long long n,p,ans=minn; long long num[maxn],te[maxn],dp[maxn],fen[maxn]; int main() { scanf("%ld%ld",&n,&p); long long maxndp=minn,maxn=minn; for(int i=1;i<=n;i++) { scanf("%ld",&num[i]); dp[i]=max(num[i],dp[i-1]+num[i]); maxndp=max(maxndp,dp[i]); te[i]=maxndp%p; if(i==1) { fen[1]=te[1]; ans=fen[1]; } else { maxn=max(maxn,fen[i-1]+te[i-1]); fen[i]=maxn; if(ans<maxn) ans=maxn%p; } } printf("%ld",ans%p); return 0; }