P1982 小朋友的数字

Posted xiaoyezi-wink

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

以上是关于P1982 小朋友的数字的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1982 小朋友的数字(NOIp2013普及组T3)

noip2013普及组 小朋友的数字

每周刷题记录--by noble_

小朋友的数字

2013小朋友的数字

小朋友的数字(codevs 3293)