zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    移动互联网整理笔记(这课内容太多了。。。)
    11.19
    hihoCoder#1879 : Rikka with Triangles (计算几何)
    hdu 4758 (AC自动机)
    hdu 4511 (AC自动机)
    2018 icpc 青岛
    hdu 6219 Empty Convex Polygons (凸包)
    2019 ccpc 秦皇岛
    2018 icpc 徐州
    hdu6599 I Love Palindrome String
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11051888.html
Copyright © 2011-2022 走看看