【dp】P1982 小朋友的数字
有趣的细节题目
题目描述
有 n 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。
作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:第一个小朋友的分数是他的特征值,其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。
请计算所有小朋友分数的最大值,输出时保持最大值的符号,将其绝对值对 p 取模后输出。
对于 100%的数据,1 ≤ n ≤ 1,000,000,1 ≤ p ≤ 10^9,其他数字的绝对值均不超过 10^9。
求的就是1.特征值 2.分数。
特征值:
算法一:
静态前缀和。
直接枚举出所有的情况(两前缀和之差就是一段区间的sum值),取max。顺便取一下
因为当前这一位存在意义就是它被取为最大区间的值,否则就应当取之前的special值,以维持它的不下降性质。但是如果想把这种思路优化到
的话,是不可以的。例如这组数据:“3 -2 3”,value[2]对于special[1]是没有意义的,但是value[1]+value[2]>0故对于special[3]有意义。
由此引申到算法二
算法二:
这是一个假算法:看做很多个子段和,还有分开的前缀和,但是不能保证每一个值是前面的最大值
算法三:
这不就是最大子段和的入门题吗(某年初赛题)然后再维持一下最大值以及顺序赋值就可以了
分数:
由题面可以得到
;
。并且在中维持不下降的性质(当
时,答案可能是
;当
,答案必为
)。那么就容易得到
。因为计算过程中有可能爆精度,但又不能马上模,一种是C++中__int128,另一种是当
时就能确定
(但是!但是!这个方法 虽然 被很多AC数据采用,但是遇到如:8 66 -511657297 151810723 -588294472 -271526366 58051666 -792123397 -76376854 -36217375 此数据时会计算出错误答案!)。如果坚持正解的话,还是用大整数或者__int128(C++)吧。
那么怎么计算呢?
题目的计算方法是
我们可以发现,
所以当计算时,我们只需要比较
与
,即看
的正负
同样的,我们需要维持这个序列的不下降性。于是就过了。
“将其绝对值对 p 取模后输出”我是先取绝对值,再按原符号not x + 1 (get到了转相反数的位运算)
另外,模数是个麻烦的问题。最早的时候,我是输入就模、计算就模,但是我忽略了一个非常明显的问题:最大值 模后 不一定最大,就是说这样计算出来的只是模后最大值。所以用以上的“另一种”方法,在确定后开始模数(于是就和大部分程序一样实际上不完全正确;但本题luogu数据(也许就是当年数据)真的非常不全面,就算很多小细节没有完全也能AC)
还有一件事:pas里面longint溢出没有报RE!90分的最后一个点WA就是因为溢出到负数!这操作很神奇
精简后的代码框架就是这样子的
【dp】P1982 小朋友的数字的更多相关文章
- 洛谷P1982 小朋友的数字
		
题目传送门 这个题的题目有点长,我们先来分析一波. 首先,这个题目中提到了以下几个量 1.最直接的就是每个小盆友手上的数字,这是题目给你的 2.每个小盆友的特征值 题目中给的定义是:每个小朋友的特征值 ...
 - P1982 小朋友的数字
		
题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个 小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋 友手上的数字之和的最大值. ...
 - 洛谷P1982 小朋友的数字——题解
		
题目传送 简单地说,这题就是让我们求前i个数的最大子串和和最值. 对于最大子串和,我们可以设一个变量qian,表示以当前元素结尾的最大子串的子串和.若搜索完第i-1个小朋友,现在看到第i个小朋友时,若 ...
 - P1982小朋友的数字
		
传送 手疼qwq 翻译一下题面.就是说,给n个数,第i个数(包括第i个)以及之前的数构成的最大子段和是i的特征值,i以前(不包括i)的数中最大的分数j+特征值j是i的分数,求所有人中的最大分数. (好 ...
 - 【洛谷P1982】小朋友的数字
		
小朋友的数字 题目链接 题目翻译: 每个小朋友有一个数字,构成一个数字序列a1,a2…an 我们定义“特征值”fi为a1~ai中的最大连续子段和 再定义“分数”si为1~i-1中最大的(sj+fj), ...
 - DP问题练习1:数字三角最短路径问题
		
DP问题练习1:数字三角最短路径问题 问题描述 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 样例: 比如,给出下列数字三角形: 2 3 4 6 5 7 4 ...
 - 「单调队列优化DP」P2034 选择数字
		
「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...
 - NOIP2013pj小朋友的数字[DP 最大子段和]
		
描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值.作为这些 ...
 - ACM/ICPC 之 DP进阶(51Nod-1371(填数字))
		
原题链接:填数字 顺便推荐一下,偶然看到这个OJ,发现社区运营做得很赞,而且交互和编译环境都很赞(可以编译包括Python,Ruby,Js在内的脚本语言,也可以编译新标准的C/C++11,甚至包括Go ...
 
随机推荐
- docker安装及概述
			
相关快捷键 退出:Ctrl-D or exit detach:Ctrl-P + Ctrl-Q Docker 核心技术 1.Namespace — 实现Container的进程.网络.消息.文件系统和主 ...
 - C/C++<算法>进制转换超详细
			
16转10 用竖式计算: 16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方 第0位: 5 * 16^0 = 5 第1位: F * 16^1 = 240 第 ...
 - 14.插入数据、复制数据--SQL
			
一.插入完整的行 要求指定表名和插入到新行中的值 INSERT INTO Customers ', 'Toy Land', '123 Any Street', 'New York', 'NY', ', ...
 - BZOJ2595(状压dp)
			
要点 设\(f[i][j][k]\)为经过点\((i,j)\)且包含点集\(k\)的最小代价,其中k是指景点集合的枚举. 考虑有两种情况:1.点\((i,j)\)作为关键点连接了两个子集时\(f[i] ...
 - 送气球.jpg(模拟)
			
链接:https://ac.nowcoder.com/acm/contest/318/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
 - NSwag生成客户端调用代码
			
NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码 https://www.cnblogs.com/hunanzp/p/9297361.html 前言 上一篇博客中我们 ...
 - git忽略已经被提交的文件
			
git忽略已经被提交的文件 git rm --cached logs/xx.log 然后更新 .gitignore 忽略掉目标文件, 最后 git commit -m "We really ...
 - tyvj P4877  _1.组合数
			
时间限制:1s 内存限制:256MB [问题描述] 从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合:从m个不同元素中取出n(n≤m)个元素的所有组合的个数 ...
 - display:none和visibility:hidden   v-show和v-if的区别
			
隐藏元素display:none 和 visibility:hidden的区别visibility:hidden可以隐藏某个元素,但是隐藏的元素仍要占据空间,仍要影响布局display:none不会占 ...
 - MapReduce的过程(2)
			
MapReduce的编程思想(1) MapReduce的过程(2) 1. MapReduce从输入到输出 一个MapReduce的作业经过了input.map.combine.reduce.outpu ...