NYOJ 422 字串和之差
来源:互联网 发布:威科数据库 编辑:程序博客网 时间:2024/05/22 13:16
题目虽然是中文的,但说的不是很清楚,求的是连续子序列和的绝对值的最大值和最小值,然后求两个绝对值的差。
刚开始还以为是最大连续子序列和的问题,发现不一样,想了一会样例,然后看了discuss后才理解了题意 = =。
分析:
这题考察的是对前n项和的理解,因为要求连续子序列和,某连续子序列和[a,b]其实就是前b项和-前a-1项和的差。
而求最大值最小值就是求前b项和与前a-1项和的差最小,只要把每一个前项和排序。
那么最大值就是首尾两项和的差(即前项和有正有负),首项的绝对值(均负),尾项(均正)。
最小值就是排序后相邻前项和之间的最小差,或者是前项和绝对值的最小值。
优化分析:
我就会一个小优化 = =。 在输入的时候就可以找出前项和绝对值的最小值。当最小值找出为0时就不需要继续找,所以后面的循环条件里面加个判断是否为0。
发散:
如果还要求这两个子序列的上下界,那只要弄个结构体存它原本的位置就行了。
代码:
/* * Author: illuz <iilluzen@gmail.com> * Blog: http://blog.csdn.net/hcbbt * File: 422.cpp * Lauguage: C/C++ * Create Date: 2013-08-29 19:01:05 * Descripton: nyoj422.cpp */#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;#define repf(i, a, b) for (int i = (a); i <= (b); i++)/****** TEMPLATE ENDS ******/const int MAXN = 1000100;int t, m, a, s[MAXN];int main() {scanf("%d", &t);while (t--) {scanf("%d", &m);s[0] = 0;int Min = 110;repf(i, 1, m) {scanf("%d", &a);s[i] = s[i - 1] + a;Min = min(abs(s[i]), Min);}sort(s + 1, s + m + 1);int Max = max(max(abs(s[1]), s[m]), abs(s[m] - s[1]));for (int i = 2; i <= m && Min; i++)Min = min(s[i] - s[i - 1], Min);printf("%d\n", Max - Min);}return 0;}
- NYOJ-422 字串和之差
- NYOJ 422 字串和之差
- nyoj 422-字串和之差
- NYOJ 422 字串和之差
- NYOJ 422 月赛 字串和之差
- NYOJ 字串和之差 (dp)
- NYOJ 题目442字串和之差(动态规划)
- noj +422字串和之差
- NYOJ 44-字串和
- nyoj 44-字串和
- NYOJ 44 字串和
- NYOJ 44 字串和
- nyoj 字串和---44
- nyoj 44 字串和
- nyoj-字和串之差
- NYOJ 44 字串和 372 巧克力 (最大连续字串和问题)
- NYOJ+dp最大字串和+注意初始化赋值那,
- nyoj-44 字串和 分治+dp+最快解法
- Java 正确的做字符串编码转换
- iOS 开发者必知的 75 个工具(译文)
- java基础知识
- git学习——衍合
- 无线网络设置不求人,早晚你会用到!
- NYOJ 422 字串和之差
- E7、重新编写课本、、、
- poj1066 Jugs
- 删除文件、目录最快的命令
- 九度OnlineJudge之1003:A+B
- 简易的灰度处理
- win7上网图标异常 但是可以正常上网解决方法
- 一天一天学 windows phone 引言 + 大概认知 之 URI映射(五)
- 不多说了,上错误,这个错误是由于我以前装过VC6.0,没卸干净,再装出事了