题目连接:http://acm.csust.edu.cn/problem/4053
博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13941876.html

Description

由于临近期末考试,辉夜为了不让自己的后辈不及格,对他进行了魔鬼的教导,石上必须每天要完成辉夜指定的题才能回家,不出意外,今天辉夜又出了一道难题,题目如下。

桌子上有 nnn 个果实,排成一排,每个果实有一个美味度,每次选择一段连续区间的果实食用,如果这个区间果实的美味度之和SiS_iSi​等于上一次食用的区间美味度之和Si−1S_{i-1}Si−1​ ,那么总的美味度就会加上∣Si∣|S_i|∣Si​∣;如果不相同, 美味度会变成负无穷,所以你需要避免存在相邻两次选的和不同的情况。∣Si∣|S_i|∣Si​∣ 表示 SiS_iSi​ 的绝对值, 并且当一个区间的果实食用完后,两边剩余的果实并不会合并成连续相邻的果实。初始的美味度为 000 ,请你计算出可以获得的最大的美味度。

特别的,第一次选择任意连续区间的果实食用时,总的美味度始终会加上∣S1∣|S_1|∣S1​∣。即:无论S1S_1S1​的值为多少,总有S0=S1S_0 = S_1S0​=S1​

石上实在写不出这么难的题目,请你帮他计算出正确答案。

input

第一行两个整数n(1≤n≤1e3)n(1 \leq n \leq 1e3)n(1≤n≤1e3),表示果实的个数

第二行nnn个整数,第iii个数ai(−1e5≤ai≤1e5)a_i(-1e5 \leq a_i \leq 1e5)ai​(−1e5≤ai​≤1e5),表示第iii个果实的美味度

output

一个整数,表示可以获得的最大的美味度

Sample Input 1
7
4 1 2 2 1 5 3
Sample Output 1
18

emmm,这题有点难说实话,对于这个序列而言,如果其序列中的所有数的符号都是一样的那么我们可以直接全部加起来取个绝对值就是最大值了。但难点在于有正数还有负数的情况,通过题目可知,在这种情况下他一定会得到一个k×∣Si∣k\times |S_i|k×∣Si​∣的答案,那么我们的目的就是找到这个SiS_iSi​并找到这个序列最多可得到多少个SiS_iSi​,最后我们取个绝对值加起来即可。

现在对于这个SiS_iSi​我们可以全部找出来,我们直接枚举一个端点然后枚举另一个端点就可以通过前缀和操作在O(n2)O(n^2)O(n2)的时间内求出全部的SiS_iSi​,那么看这个时间复杂度应该就是正确的了,但我们现在还需要确定kkk的值,很显然,我们不能再跑一次循环,我们只能在O(n2)O(n^2)O(n2)的写法的同时求出kkk这个值,那么我们可以联想的就是对每个值做一个映射,然后从最早的区间开始进行无重复区间的累加。那么这个映射只能用map来完成,那么怎么统计区间并判断是否有重叠呢?

首先我们要思考怎么枚举区间呢?你要么枚举起点要么枚举终点,但很明显,枚举起点的话很难处理重叠部分,但如果我们枚举终点再枚举起点的话对于重叠部分就很好处理,我们保存每个值的最后区间的终点edied_iedi​,对于每个起点大于edied_iedi​的区间我们不做统计就好了。也就是说我们对于每个值需要保存它的数量和其最后区间的终点,那么我们可以用map套个结构体或者套个pair

以下是AC代码:

#include <bits/stdc++.h>
using namespace std;const int mac=1e3+10;
typedef long long ll;
const int inf=1e9+10;
typedef pair<int,int> pill;int a[mac];
int ans=0,sum[mac];
map<int,pair<int,int> >mp;int main(int argc, char const *argv[])
{int n,flag=0;scanf ("%d",&n);for (int i=1; i<=n; i++){scanf ("%d",&a[i]);sum[i]=sum[i-1]+a[i];}for (int i=1; i<=n; i++){for (int j=i-1; j>=0; j--){int val=sum[i]-sum[j];if (!mp[val].first) mp[val]={1,i};else {if (mp[val].second<j+1) mp[val].first++,mp[val].second=i;}ans=max(ans,abs(val)*mp[val].first);}}printf ("%d\n",ans);return 0;
}

当然,上面的代码是有了很多程度简化的,实际上刚开始的时候用的是map套vector套pair来维护这个东西的,但更容易理解。
以下是AC代码:

#include <bits/stdc++.h>
using namespace std;const int mac=1e3+10;
typedef long long ll;
const int inf=1e9+10;
typedef pair<int,int> pill;int a[mac];
int ans=0,sum[mac];
map<int,vector<pill> >mp;int main(int argc, char const *argv[])
{int n,flag=0;scanf ("%d",&n);for (int i=1; i<=n; i++){scanf ("%d",&a[i]);sum[i]=sum[i-1]+a[i];}for (int i=1; i<=n; i++){for (int j=i-1; j>=0; j--){int val=sum[i]-sum[j];if (mp[val].empty()){mp[val].push_back({j+1,i});}else {int p=mp[val][mp[val].size()-1].second;if (p<j+1) mp[val].push_back({j+1,i});    }ans=max(ans,abs(val)*(int)mp[val].size());}}printf ("%d\n",ans);return 0;
}

CSUSTOJ-石上优想要逃离(STL+思维暴力)相关推荐

  1. 石上优想要逃离(map)

    题目链接:石上优想要逃离. 菜狗就是去年不会写的题今年还不会写,www- 思路:前缀和处理,外循环枚举终点,内循环枚举起点,map记录所有可能的 SiS_iSi​,pair或结构体一个记录个数一个记录 ...

  2. CSUSTOJ-石上优不想留级(一维坐标三分及思维解法)

    题目连接:http://acm.csust.edu.cn/problem/4043 博客园食用链接: https://www.cnblogs.com/lonely-wind-/p/13941890.h ...

  3. 新的一年,您在学习和工作上,想坚守所学,还是尝试转型呢?

     4-5年工作的时候,有点徘徊,别人写的好东西 转一下 http://www.cnblogs.com/WizardWu/archive/2009/12/27/1633260.html 新的一年,您 ...

  4. matlab如何花间,酌酒花间,磨针石上;倚剑天下,挂弓扶桑。赞颂的是谁

    韩琴1009的回答: 赞颂的是唐代大诗人李白.这句话出自郭沫若先生题江油李白纪念馆的楹联.这幅楹联每四个字都对应了李白的一首诗中的句子: 酌酒花间:出自唐代李白所作的<月下独酌四首·其一> ...

  5. 怎么取消苹果手机自动续费_手机上优酷会员怎么取消自动续费

    我们经常会在手机上下载优酷观看一些视频,但是优酷很多视频是需要会员功能才能看的,因此很多小伙伴都会购买会员,但是购买会员之后,默认是开通自动续费的服务的,如果不想自动续费,避免扣费造成影响,那么就要注 ...

  6. 赐他一块白石,石上写着新名

    嘲笑他人是一件令人遗憾的事情.当你把目光都集中在别人的错误和缺点上时,就自然会忽略他们身上闪光的一面.而一个人只有具备了审视美好事物的能力,世界对他来说才会变得更加美好. 你可以给自己找一个貌似合理的 ...

  7. 画瀑布图_道砟石上的庐山瀑布惟妙惟肖

    江南都市报讯 全媒体记者章娜.喻雪君.实习生廖铖报道:一群天天与道砟接触的铁路人,在采石的时候,萌发艺术的灵感,于是他们在一块块经过大自然冲刷雕琢的石块上作画,绘制出一个又一个生动的石绘艺术作品:庐山 ...

  8. AI就是闭上眼想要一份凉皮,睁开眼就会有一份凉皮摆在眼前

    回答这个问题之前,先听下这段对话: "你愿意让别人帮你干活吗?" "愿意!" "那么你愿意让别人干你的活吗?" "愿意" ...

  9. 每个人表面上都想改变自己,但内心却都抗拒改变,这仅仅是人性的懒惰和矛盾?

    每个人表面上都想改变自己,但内心却都抗拒改变. 这是人性的懒惰和矛盾,当然不仅仅只有这一个原因,还有一个更深层的问题.常年的坏习惯已经在你大脑中形成的机制.也就是你在没事的时候反思自己的时候,发现自己 ...

最新文章

  1. WPF中的容器控件——Grid
  2. SAP Spartacus focus directive增强之后的两次focus问题
  3. Misc混合halcon算子,持续更新
  4. linux 连接wifi不稳定,rtl8188ce 无线网不稳定终极解决方案 - 哆啦比猫的技术瞎扯 - Arch Linux · ドラえもん · 实时绘制...
  5. 如何知道电脑服务器操作系统,电脑如何查看服务器操作系统
  6. python中argmin函数_Python numpy.argmin()用法及代码示例
  7. 在android中编程制作kml、kmz文件的思路
  8. redis课程视频 黄建宏_Redis从入门到精通 视频教程 下载
  9. window.crypto.subtle进行rsa-oaep加密
  10. python与排版设计欣赏_有哪些排版惊艳的建筑作品集?
  11. 个人博客页面的简单实现
  12. QML 图形渲染 - Displace
  13. 我在阿里十年:揭密阿里人才培养体系
  14. 百度的镜像网站,有意思…………
  15. 一种基于深度学习的遥感图像分类及农田识别方法
  16. 学习H5仿制网站时遇到的问题
  17. 电磁感应式无线充电系统详解
  18. ts 之 Pick 和 Omit
  19. sd卡计算机接口,sd卡怎么插电脑上
  20. FrontPage基础教程 表单的设计

热门文章

  1. 首只互联网大数据基因指数发布
  2. RT-Thread FAL组件 STM32F407 注意事项
  3. oracle有两个文件,我常用的两个ORACLE的文件
  4. 计算机一级MS表格题,2016年计算机一级MSOFFICE综合训练题
  5. 【HBase学习之四】HBase Client超时机制优化
  6. 【数据结构】树与二叉树
  7. 用于管理虚拟环境的 Python 工具
  8. android 震动Vibrator
  9. Linux Mint (应用软件— 翻译工具:有道词典)
  10. US5M-ASEMI贴片快恢复二极管US5M