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

[NOIP普及2013] 小朋友的数字

时间:2017-11-06 13:14:02      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:block   int   数字   开心   bool   bsp   包括   long   noip   

我可能今天智商不在线?

读题读不懂?

让我们来看两段的描述:

  • 规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。

如果你开开心心去写连续子段和,恭喜你~WA了。因为题目的意思是前面任意一个小朋友的数字的最大值(但要要保证连续)

  • 第一个小朋友的分数是他的特征值,其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。

如果你看到其特征值产生了疑惑,其到底是当前的小朋友本人,还是选择加的那个小朋友。不要着急请看样例。

#include <cstdio>
#include <algorithm>
#include <cstring>
typedef long long ll;
int n;
ll a[1000005];
ll mod,dp[1000005],Max;
ll Sum[1000005];

const int INF = 0x3f3f3f3f;

int main(){
    scanf("%d%lld",&n,&mod);
    for(int i=1;i<=n;++i){
        scanf("%lld",&a[i]);
        dp[i] = std::max(dp[i-1]+a[i],a[i]);
    } 
    for(int i=2;i<=n;++i){
        dp[i] = std::max(dp[i-1],dp[i]);
        //printf("dp[%d]:%lld\n",i,dp[i]);
        //printf("i:%d - %lld\n",i,Max);
    }
    Sum[1] = dp[1];
    Sum[2] = dp[1] + dp[1];
    bool flag=0;
    //for(int i=1;i<=n;++i) printf("dp[%d]:%lld\n",i,dp[i]);
    for(int i=3;i<=n;i++){
        Sum[i]+=Sum[i-1];
        if(dp[i-1] > 0) Sum[i]+=dp[i-1];
        if(Sum[i] > Sum[1]) flag=1;
        if(flag==1) Sum[i]%=mod;
    }
    //for(int i=1;i<=n;i++) printf("dp[%d]:%lld\n",i,Sum[i]);
    if(flag) printf("%lld\n",Sum[n]);
    else printf("%lld\n",Sum[1]);
    return 0;
}

 

[NOIP普及2013] 小朋友的数字

标签:block   int   数字   开心   bool   bsp   包括   long   noip   

原文地址:http://www.cnblogs.com/OIerLYF/p/7792602.html

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