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;
}

 

posted @ 2019-06-19 15:59  晔子  阅读(218)  评论(0编辑  收藏  举报