码迷,mamicode.com
首页 > 其他好文 > 详细

P1982 小朋友的数字

时间:2019-06-19 17:02:31      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:技术   题意   mamicode   blank   com   描述   info   朋友   data   

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 小朋友的数字

标签:技术   题意   mamicode   blank   com   描述   info   朋友   data   

原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11051888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!