P1982小朋友的数字
手疼qwq


翻译一下题面。就是说,给n个数,第i个数(包括第i个)以及之前的数构成的最大子段和是i的特征值,i以前(不包括i)的数中最大的分数j+特征值j是i的分数,求所有人中的最大分数。
(好吧翻译之后更看不懂了qwq)
这看起来像一个dp,还是两次dp
那我们就拿dp试试(太过蒟蒻不会写暴力)
对于特征值,我也是看了题解才知道这是个最大子段和问题
那我们看一下最大字段和怎么做
1.暴力(O(n^3))显然超时,不讨论
2.分治算法(我不会)
3.dp(补习完滚回来写博) (O(n)(最快的一种算法))
所有算法请走这里
这里我们简单的说一下dp求最大子段和
设dp[i]是以num[i]结尾的最大子段和(这个子段中一定包含num[i])
则dp[i]=max(num[i],dp[i-1]+num[i])
相当于说要么是之前的dp[i-1]再加上num[i]是以num[i]结尾的最大子段和,要么之前的不要了,选a[i]作为dp[i]
最终答案当然不是dp[n],因为num[n]不一定要在最大子段结尾。
最终答案是在所有的dp[i]中的最大值
于是就有了求t[i](特征值)的代码了
long long maxn=-;
for(int i=;i<=n;i++)
{
dp1[i]=max(dp1[i-]+num[i],num[i]);
if(dp1[i]>maxn)maxn=dp1[i];
t[i]=maxn%p;//一个unbelievable的地方:中间不模会炸!!!(就算是小数据也会炸qwq)(未解之谜*1) }
接下来求分数
未解之谜2警告
我们设maxn为当前所有f[i](分数)中的最大值,那么maxn的转移方程:
maxn=max(maxn,f[i-1]+t[i-1])
f[i]=maxn
未解之谜2:
设f[i]为当前i的分数,则f[i]为之前的所有f[j](1<=j<i)中最大的一个,f[i]=max(f[i-1],f[i-1]+t[i-1])
但上面那个是不对的,这是为什么呢?我也不知道啊。
好了我们自动忽视上面的未解之谜2
如果maxn>ans,则ans=maxn%p(一定要在这里模,放在最后模会wa(未解之谜1))
所以我们就有了ac代码(%%%神仙ych)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
long long n,p,num[N],dp1[N],f[N],t[N],ans=-;
int main()
{
scanf("%lld%lld",&n,&p);
for(int i=;i<=n;i++)
scanf("%lld",&num[i]);
long long maxn=-;
for(int i=;i<=n;i++)
{
dp1[i]=max(dp1[i-]+num[i],num[i]);
if(dp1[i]>maxn)maxn=dp1[i];
t[i]=maxn%p; }
maxn=-;
f[]=t[];ans=f[];
for(int i=;i<=n;i++)
{
maxn=max(maxn,f[i-]+t[i-]);
f[i]=maxn;
if(maxn>ans)ans=maxn%p;
printf("%d %lld\n",i,f[i]);
}
cout<<ans;
}
综合两个未接之谜,数据可能有锅
我太菜了,找不到自己的锅
ps:如果能回答那两个未解之谜请评论,万谢qwq
P1982小朋友的数字的更多相关文章
- 【dp】P1982 小朋友的数字
有趣的细节题目 题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之 ...
- P1982 小朋友的数字
题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个 小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋 友手上的数字之和的最大值. ...
- 洛谷P1982 小朋友的数字
题目传送门 这个题的题目有点长,我们先来分析一波. 首先,这个题目中提到了以下几个量 1.最直接的就是每个小盆友手上的数字,这是题目给你的 2.每个小盆友的特征值 题目中给的定义是:每个小朋友的特征值 ...
- 洛谷P1982 小朋友的数字——题解
题目传送 简单地说,这题就是让我们求前i个数的最大子串和和最值. 对于最大子串和,我们可以设一个变量qian,表示以当前元素结尾的最大子串的子串和.若搜索完第i-1个小朋友,现在看到第i个小朋友时,若 ...
- 【洛谷P1982】小朋友的数字
小朋友的数字 题目链接 题目翻译: 每个小朋友有一个数字,构成一个数字序列a1,a2…an 我们定义“特征值”fi为a1~ai中的最大连续子段和 再定义“分数”si为1~i-1中最大的(sj+fj), ...
- NOIP2013pj小朋友的数字[DP 最大子段和]
描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值.作为这些 ...
- 小朋友的数字(codevs 3293)
题目描述 Description 有n个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数 ...
- <<小朋友的数字>>核心代码
for(i=l;i<=n;i++) { a[i]=read(); t=t+a[i]; if (t>maxn) maxn=t if( t<0) t=0; b[i]=maxn; }
- 每周刷题记录--by noble_
学习hzwer的博客. ----------------------------------------------------------------- 2017.10.3 主要是水题与傻逼dp: ...
随机推荐
- vue 中注册全局组件
1 全局注册组件 建一个 js 文件, 注册全局组件, 并且暴露出去 然后再在 main.js 中引入 在页面就可以直接使用了 2 全局注册过滤器 建立文件, 包含所有过滤器方法 ...
- 触摸板PCB制作-TM12
1.布局: 使 PSoC 与Sensor之间的距离保持最小化是一个不错的做法. 通常将 PSoC 与其他组件一起贴装到底层,而将 CapSense Sensor置于顶层上. Sensor和栅格地层位 ...
- jvm学习(2)JVM内存说明
前言 一.类方法 类方法是静态方法,前面需要有static修饰符修饰.类方法内不能涉及有关变量的内容1.不能调用类的对象方法2.不能引用对象变量3.类方法不能被重写(覆盖)4.类方法不能使用super ...
- SCUT - 142 - 第n个素数
https://scut.online/p/142 但是洲阁筛打表还是超时了,打的表不够长吧,在51nod上面要跑5s.要是快10倍得要密1000倍,根本打不出来(时间意义). 暴力check要找的质 ...
- python 模块导入import和import from区别
模块就是一个.py文件,在名字空间下导入模块导入import和import from,那么python 模块导入import和import from区别是什么呢 1,import 导入模块 impor ...
- MVC一个action对应多个视图的写法
一,如下代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- 13、前端知识点--ajax原理以及实现过程
一.简略版的 Ajax简介 Ajax(Asyncchronous JavaScript and Xml),翻译过来就是说:异步的javaScript和xml, Ajax不是新的编程语言,而是一种使用现 ...
- win32 socket编程(二)——TCP/IP
一.大端.小端法定义 1.1小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. (主机字节顺序) 1.2 大端法(Big-Endian ...
- spark sql 操作
DSL风格语法 1.查看DataFrame中的内容 scala> df1.show +---+--------+---+ | id| name|age| +---+--------+---+ | ...
- 利用vsftpd在Linux构建安全的FTP服务
最近在机房搭建Linux环境,需要用到了FTP服务,查看了许多的资料,在这里做一下笔记 一.安装 方法一,使用yum命令安装,需要能够连接外网 # yum install vsftpd 方法二,使用安 ...