第22题(动规):小朋友的数字

原创 2018年04月15日 13:21:27

Description

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

作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:第一个小朋友的分数是他的特征值,其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。

请计算所有小朋友分数的最大值, 输出时保持最大值的符号,将其绝对值对 p 取模后输出。

Input

第一行包含两个正整数 n、 p,之间用一个空格隔开。

第二行包含 n 个数,每两个整数之间用一个空格隔开,表示每个小朋友手上的数字。

Output

输出只有一行, 包含一个整数, 表示最大分数对 p 取模的结果。

Sample Input

【输入样例1】
5 997
1 2 3 4 5
【输入样例2】
5 7
-1 -1 -1 -1 -1

Sample Output

【输出样例1】
21
【输出样例2】
-1

HINT

【输入输出样例1说明】

小朋友的特征值分别为 1、 3、 6、 10、 15,分数分别为 1、 2、 5、 11、 21,最大值 21对 997 的模是 21。

【输入输出样例2说明】

小朋友的特征值分别为-1、 -1、 -1、 -1、 -1,分数分别为-1、 -2、 -2、 -2、 -2,最大值-1 对 7 的模为-1,输出-1。

【数据范围】

对于 50%的数据, 1 ≤ n ≤ 1,000, 1 ≤ p ≤ 1,000所有数字的绝对值不超过 1000;

对于 100%的数据, 1 ≤ n ≤ 1,000,000, 1 ≤ p ≤ 10^9, 其他数字的绝对值均不超过 10^9。

AC CODE(500ms+):

#include<bits/stdc++.h>
using namespace std;
long long max(long long a,long long b){
    return a>b?a:b;
}
long long n,p,a[1000000],s=-1e18,t=0,ans,tmp;
int main(){
    cin>>n>>p;
    tmp=p;
    for(long long i=1;i<=n;i++)cin>>a[i];
    for(long long i=1;i<=n;i++){
        t+=a[i];
        s=max(t,s);
        if(t<0) t=0;
        a[i]=s;
    }
    s=a[1]*2;
    ans=a[1]; 
    bool b=true;
    p=tmp;
    for(long long i=2;i<n;i++){
        if(a[i]>0){
            t=s;
            s=(s+a[i])%p;
            ans=s;
            if(t>a[1])b=false;
        } 
    }
    if(b) ans=a[1];
    cout<<ans;
}

AC CODE2(180ms+):

#include<cstdio>
#define ll long long
inline ll read(void){
    char ch;
    bool f=false;
    ll ret=0;
    while((ch=getchar())<'0'||ch>'9'){
        if(ch=='-') f=true;
    }
    while(ch>='0'&&ch<='9'){
        ret=ret*10+(ch-'0');
        ch=getchar();
    }
    if(f) ret=-ret;
    return ret;
}
ll max(ll a,ll b){
    return a>b?a:b;
}
ll n,p,a[1000000],s=-1e18,t=0,ans,tmp;
int main(){
    n=read();
    p=read();
    tmp=p;
    for(ll i=1;i<=n;i++) a[i]=read();
    for(ll i=1;i<=n;i++){
        t+=a[i];
        s=max(t,s);
        if(t<0) t=0;
        a[i]=s;
    }
    s=a[1]*2;
    ans=a[1]; 
    bool b=true;
    p=tmp;
    for(ll i=2;i<n;i++){
        if(a[i]>0){
            t=s;
            s=(s+a[i])%p;
            ans=s;
            if(t>a[1]) b=false;
        } 
    }
    if(b) ans=a[1];
    printf("%lld",ans);
    return 0;
}

数字成像系统

数字成像系统暨Image signal processor原理培训,涵盖成像系统基础5讲:1. 数字成像系统介绍2. CMOS image sensor基础3. 镜头光学基础4. 颜色科学基础5. ISP 信号处理基础,以及ISP各模块:6.黑电平与线性化7.Green Imbalance8:9.坏点消除等21讲,3A技术以及图像质量评价与调校6讲
  • 2017年10月14日 07:20

击鼓传花

击鼓传花(flower.cpp) 明明最近经常在教室里跟同学一起玩击鼓传花的游戏,规则是第n个拿到花的小朋友必须说出n!最后一位非0 的数字,如此循环游戏,如果谁讲错了就得罚唱一支歌曲。 ...
  • u012746396
  • u012746396
  • 2013-11-07 20:45:52
  • 1097

一些动规题

ps:代码有点丑。 二维偏序的最长上升子序列 看到标题是不是觉得很水呢。。。 但是如果其中一维是dfs序,即在树上呢。。。 而且,还得缩环成树。。。 先缩环,一维dfs,二维线段树or单调栈...
  • huyuncong
  • huyuncong
  • 2011-10-27 16:17:01
  • 797

【ACM训练计划】 HDU 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】

Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内...
  • synapse7
  • synapse7
  • 2013-11-19 09:02:56
  • 2139

【动态规划DP,二维动归】poj1651,Multiplication Puzzle

http://poj.org/problem?id=1651 有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个...
  • mmc2015
  • mmc2015
  • 2015-08-06 19:46:19
  • 1558

noip 动规模拟题

  • 2011年08月28日 12:50
  • 3.87MB
  • 下载

头脑风暴-数字逻辑题目

1.5,5, 14,38,87,( )A.167 B. 168 C.169 D. 170 解题思路:两两之差为0,9,24,49,80即为1的平方-1,3的平方,5的平方-1,7的平方,9的平...
  • wsk_228
  • wsk_228
  • 2006-07-09 17:17:00
  • 4980

CCF 2017_12月考试第2题解析

游戏   有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。   游戏开...
  • fanjialiang2401
  • fanjialiang2401
  • 2018-02-07 18:46:15
  • 305

OCP-1Z0-051-题目解析-第22题

22. You need to create a table for a banking application. One of the columns in the table has the fo...
  • wjx515628
  • wjx515628
  • 2014-06-28 22:19:50
  • 1238

动态规划--学习笔记

动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。 举例: 线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等; 区域动规:石子合并, 加分二叉树,统计单词个数,炮...
  • qing101hua
  • qing101hua
  • 2016-01-22 14:04:43
  • 288
收藏助手
不良信息举报
您举报文章:第22题(动规):小朋友的数字
举报原因:
原因补充:

(最多只允许输入30个字)