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: ...
随机推荐
- hdu-2255.奔小康赚大钱(最大权二分匹配)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Lost Cows POJ 2182 思维+巧法
Lost Cows POJ 2182 思维 题意 是说有n头牛,它们身高不一但是排成了一队,从左到右编号为1到n,现在告诉你从第二号开始前面的那些牛中身高小于它的个数,一共有n-1个数.然后求出它们按 ...
- SCUT - 11 - 被钦定的选手 - 质因数分解
https://scut.online/p/11 T了好多次,还想用mutimap暴力分解每个数的质因数.后来记录每个数的最小质因子过了. #include <bits/stdc++.h> ...
- Linux mint启用内核转储
1.查看当前是否启动了内核转储: star@sky:~$ ulimit -c unlimited 2.如果上面显示为0,即没有开启,那么,直接执行 ulimit -c unlimited 就好了. 3 ...
- 搜索---BFS
搜索 深度优先搜索和广度优先搜索广泛的应用于树和图中,但是他们的应用远不止于此. BFS 广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点 ...
- Asp.net中GridView使用详解(很全,很经典)
http://blog.csdn.net/hello_world_wusu/article/details/4052844 Asp.net中GridView使用详解 效果图参考:http://hi.b ...
- CentOS7搭建Hadoop2.8.0集群及基础操作与测试
环境说明 示例环境 主机名 IP 角色 系统版本 数据目录 Hadoop版本 master 192.168.174.200 nameNode CentOS Linux release 7.4.1708 ...
- Nginx优化_压缩处理与内存缓存
对页面进行压缩处理; 服务器内存缓存. 1.对页面进行压缩处理 [root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf http { ... gzip ...
- Redis复制实现原理
摘要 我的前一篇文章<Redis 复制原理及特性>已经介绍了Redis复制相关特性,这篇文章主要在理解Redis复制相关源码的基础之上介绍Redis复制的实现原理. Redis复制实现原理 ...
- 【Java学习笔记】线程安全的单例模式及双重检查锁—个人理解
搬以前写的博客[2014-12-30 16:04] 在web应用中服务器面临的是大量的访问请求,免不了多线程程序,但是有时候,我们希望在多线程应用中的某一个类只能新建一个对象的时候,就会遇到问题. 首 ...