Codeforces 332B Maximum Absurdity(DP+前缀和处理)
题目链接:http://codeforces.com/problemset/problem/332/B
题目大意:
给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两个区间的起点。
解题思路:
先计算前缀和,然后预处理出maxsum[i],maxsum[i]记录i~n最大的长度为k子段的和。
然后再去枚举即可。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<vector> 5 #include<string> 6 #include<string.h> 7 #include<cctype> 8 #include<math.h> 9 #include<stdlib.h> 10 #include<stack> 11 #include<queue> 12 #include<set> 13 #include<map> 14 #define lc(a) (a<<1) 15 #define rc(a) (a<<1|1) 16 #define MID(a,b) ((a+b)>>1) 17 #define fin(name) freopen(name,"r",stdin) 18 #define fout(name) freopen(name,"w",stdout) 19 #define clr(arr,val) memset(arr,val,sizeof(arr)) 20 #define _for(i,start,end) for(int i=start;i<=end;i++) 21 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0); 22 using namespace std; 23 typedef long long LL; 24 const int N=5e6+5; 25 const LL INF64=1e18; 26 const int INF=0x3f3f3f3f; 27 const double eps=1e-10; 28 29 LL sum[N]; //记录前缀和 30 LL maxsum[N]; //maxsum[i]记录i~n最大的长度为k子段的和 31 int idx[N]; //idx[i]记录相应的i~n最大子段的起点 32 33 int main(){ 34 FAST_IO; 35 int n,k; 36 cin>>n>>k; 37 for(int i=1;i<=n;i++){ 38 cin>>sum[i]; 39 sum[i]+=sum[i-1]; 40 } 41 int lim=n-k+1; 42 for(int i=lim;i>=1;i--){ 43 LL now=sum[i+k-1]-sum[i-1]; //now为i~i+k-1之和 44 if(now>=maxsum[i+1]){ //因为要保证答案字典序最小,所以下标往小的取 45 maxsum[i]=now; 46 idx[i]=i; 47 } 48 else{ 49 maxsum[i]=maxsum[i+1]; 50 idx[i]=idx[i+1]; 51 } 52 } 53 54 int st1=1,st2=k+1; 55 LL mmax=sum[2*k]; 56 for(int i=1;i<=lim-k;i++){ 57 LL now=sum[i+k-1]-sum[i-1]; 58 if(now+maxsum[i+k]>mmax){ //maxsum[i+k]为i+k~n最大的长度为k的子段和 59 mmax=now+maxsum[i+k]; 60 st1=i,st2=idx[i+k]; 61 } 62 } 63 cout<<st1<<" "<<st2<<endl; 64 return 0; 65 }
转载于:https://www.cnblogs.com/fu3638/p/9131472.html
Codeforces 332B Maximum Absurdity(DP+前缀和处理)相关推荐
- [CodeForces 332B]Maximum Absurdity[DP]
题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...
- codeforces 332b Maximum Absurdity dp
题意: 有n个数,找两个段(每个段长度为k)不相交,求出这两个段的和的最大值. 输出两个段的起始下标. 思路: dp[i][j]:走到i,已经选了j个段的最大值. 转移:dp[i][j] = dp[i ...
- 【CodeForces 332B --- Maximum Absurdity】递推
[CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...
- CodeForces - 332B Maximum Absurdity 前缀和
这道题主要用的前缀和的思想,看了网上大佬的代码感觉很巧妙.我之前有好几个点没注意,WA了好几次,还有就是要用long long类型.不多说了,直接贴AC代码: #include<cstdio&g ...
- CodeForces 332B Maximum Absurdity
http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...
- Codeforces 332B Maximum Absurdity(暴力)
题意: 给你一个序列,让你在里面选择两个不想交的长度为k的字段,是的和最大. 我第一次做还是用的dp,感觉复杂度有点高啊,后来发现直接预处理就好了. 预处理需要三个数组,分别是sum[i],Max[i ...
- CodeForces 332B Maximum Absurdity(线段树单点更新)
题意: 给你一个序列,找两个长度为 k 且没有重合区间的数使得其和最大 解析: 线段树,就是把起点为 i 长度为 k 的和预处理出来,再枚举a,与a线段不重合的,后面的部分用线段树来找最大位置,总复杂 ...
- codeforce 332B Maximum Absurdity
原题链接 题意 一个长为N的序列,选择其中2个长为K的不相交区间,使两个区间和最大 题解 CF标签上写的好好的DP,做着做着发现就是前缀和思想嘛,哪里有DP?哪里有DP? #include<bi ...
- codeforces B.Maximum Absurdity 解题报告
题目链接:http://codeforces.com/contest/332/problem/B 题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a ...
最新文章
- 为sort函数指定排序规则时注意的问题以及错误的写法
- 动画延迟效果css,每个子元素都有延迟的CSS动画
- ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图
- java语言基础与go语言基础,数据类型区别
- 计算机应用头部案例提交,基于头部位置的应用程序放置的制作方法
- 怎么对document.write写出来的内容调整对齐方式_写论文可能用到的各种Word技巧
- python读取数据文件、并把里面的数据变成x的二维坐标_(数据科学学习手札60)用Python实现WGS84、火星坐标系、百度坐标系、web墨卡托四种坐标相互转换...
- python装饰器@深度加工(三分钟读懂)
- Java开发全套学习!java微服务网关
- SqlServer系列笔记——游标
- IBM AIX存储层结构及操作命令实现
- Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感 是印度上古时期一些文献的总称
- 百度地图 绘制运动轨迹_国产免费高配版“谷歌地球”,地图分析用这款软件秒杀谷歌地球...
- OA系统如何助力企业行政管理?
- 读书笔记之怎样在股市获得稳健收益
- MT6573芯片资料集锦MT6575入门手册 V0.2
- CTU Open Contest 2019 -A-Beer Barrels
- NoticeBar 通知栏组件,封装好的可直接使用
- webgis中的比例尺实现
- 关于对游戏帧率的学习