codeforces B.Maximum Absurdity 解题报告
题目链接:http://codeforces.com/contest/332/problem/B
题意:在一个序列中,在所有长度为k的区间里找出两个不重叠的最大和,输出这两个最大和所对应的开头的位置a和b。
一开始没有想到用dp来做,于是有了以下的错误思路(读者可以忽略):声明一个结构体,包括head(保存起始点)、tail(保存结束点)还有sum(保存长度为k的区间的和)。计算出整个序列所有k个小区间的和sum,按sum从大到小排序(隐含的弊端:排序会导致区间与区间之间起始点和结束点的位置很不确定)由于a、b不能相交,所以当找到没有重叠的部分,就找到当前最优解,但不一定是整个题目的最优解。还要比较各个序列的最优解,以便找到整个题目的最优解,但是重叠的判断会有很多种情况(sum的排序导致的),于是参考了别人的代码......
正确的思路:当然就是用dp做啦。而且,也是需要计算出所有长度为k的区间的和,按顺序保存在数组b[]中(比我的方法好多啦)。接下来是找出状态转移方程: max{b[i]} + b[i+k]。另外,考虑到数据比较大,所以用长整型(_int 64)来保存数据。
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 using namespace std; 5 6 #define LL __int64 7 const int maxn = 200000 + 10; 8 LL a[maxn], b[maxn]; 9 10 int main() 11 { 12 int i, j, n, k; 13 LL tl, maxt, maxl, maxr, ans; 14 while (scanf("%d%d", &n, &k) != EOF) 15 { 16 LL temp = 0; 17 for (i = 1; i <= n; i++) 18 { 19 scanf("%I64d", &temp); 20 a[i] = a[i-1] + temp; // a[i]保存的是从第1至第i个元素的总和 21 // printf("a[%d] = %I64d\t", i, a[i]); 22 } 23 for (i = 0, j = 1; i <= n-k; i++, j++) 24 { 25 b[j] = a[i+k] - a[i]; // b[j]保存的是所有长度为k的区间的总和26 // printf("b[%d] = %I64d\t", j, b[j]); 27 } 28 maxt = ans = b[1]; 29 tl = maxl = maxr = 1; // maxl: a maxr:b30 for (i = 1; i+k <= n-k+1; i++) // 循环的判别要注意,要保证取值不能越界31 { 32 if (b[i] > ans) // 状态转移方程中的max{b[i]},用ans保存33 { 34 ans = b[i]; 35 tl = i; 36 // printf("ans = %I64d\n", ans); 37 } 38 if (b[i+k] + ans > maxt) 39 { 40 maxt= b[i+k] + ans; 41 maxl = tl; 42 maxr = i+k; 43 // printf("maxt = %I64d\n", maxt); 44 // printf("maxl = %I64d\tmaxr = %I64d\n", maxl, maxr); 45 } 46 } 47 printf("%I64d %I64d\n", maxl, maxr); 48 } 49 return 0; 50 }
转载于:https://www.cnblogs.com/windysai/p/3220305.html
codeforces B.Maximum Absurdity 解题报告相关推荐
- 【CodeForces 332B --- Maximum Absurdity】递推
[CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...
- [CodeForces 332B]Maximum Absurdity[DP]
题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...
- Codeforces round 654 赛后解题报告
Codeforces round 654 赛后解题报告 先吐槽一下怎么 A-D 都是结论题啊啊 A. Magical Sticks 我们可以先确定下来,我们一定只对于未进行过拼接的木棍拼接. 学过等差 ...
- Codeforces 438D 线段树 解题报告
D. The Child and Sequence At the children's day, the child came to Picks's house, and messed his hou ...
- Codeforces 332B Maximum Absurdity(DP+前缀和处理)
题目链接:http://codeforces.com/problemset/problem/332/B 题目大意: 给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两 ...
- LeetCode: Maximum Subarray 解题报告
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- CodeForces 332B Maximum Absurdity
http://codeforces.com/problemset/problem/332/B 给出n个数,再个一个长度,问在n个数的数列中,找到2个相应长度的数串求和最大,且这两个数串不能重叠.只要对 ...
- codeforces 488A. Giga Tower 解题报告
题目链接:http://codeforces.com/problemset/problem/488/A 题目意思:给出一个数a,范围是[-10^9, 10^9],问它最少需要加的一个正整数 b 是多少 ...
- codeforces A. Cinema Line 解题报告
题目链接:http://codeforces.com/problemset/problem/349/A 题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这 ...
最新文章
- Oracle中sysdba身份和dba角色区别
- Solr安装步骤 + dataimport导入数据配置
- 【译】From Smart Contracts to Courts with not so Smart Judges
- 编程挑战系统的输入和输出详细说明
- as400还有发展前景吗_web前端还有发展前景吗?该如何去学习
- linux下gcc的编译过程详解
- IntelliJ Idea学习笔记001--- IntelliJ Idea常用快捷键列表
- 更新k8s镜像版本的三种方式
- java项目学习_一个Java项目的学习
- cad多个窗口并排显示_高版本CAD如何显示阵列窗口?
- Linux学习笔记5-linux中的磁盘
- PRML Chapter 02 Probability Distributions
- js在光标处插入内容
- keytool的使用
- Simulink代码生成:Simulink Function子系统及其代码
- (十二):为什么需要一个新的ORM框架
- 硬路由、软路由、主路由、旁路由对比分析
- C++ 汇编代码分析——递归函数调用、浮点数比较、选择语句
- 逻辑回归中的梯度下降法
- 横河川仪压力变送器故障代码_压力变送器常见故障及解决办法
热门文章
- java 语言的简介
- 非零基础自学Golang 第15章 Go命令行工具 15.4 注释文档(doc)
- 老股民箱底翻出发黄纸质股票 如今价值超过20万
- C语言实现MD5加密算法
- Jfinal-Controller层注入Service空指针异常
- 赵栋《面向对象程序设计(java)》第十四周学习总结
- 关于Solidworks打包的更好的方式(并保留部分文件结构)——使用“另存为”保存装配体
- matlab与maple互联,Maple与Matlab
- mac电脑安装maple2017
- 3GPP TS 23501-g51 中英文对照 | 5.2.1 General