【u207】最小值
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
N个数排成一排,你可以任意选择连续的若干个数,算出它们的和。问该如何选择才能使得和的绝对值最小。
如:N=8时,8个数如下:
1 2 3 4 5 6 7 8
-20 90 -30 -20 80 -70 -60 125
如果我们选择1到4这4个数,和为20,还可以选择6到8这3个数,和为-5,|-5|=5,该方案获得的和的绝对值最小。
【输入格式】
第一行输入N,表示数字的个数。接下来N行描述这N个数字。
【输出格式】
第一行输出一个整数,表示最小绝对值的和,第二行包含两个整数表示形成该绝对值和最长序列的长度。
【数据规模】
40%的数据 N<=4000 对于许多数据,最长序列的长度唯一。 100%的数据 N<=100000,|每个数字的值|<=10^10
Sample Input1
20
12
-220
-195
-316
-300
668
576
1034
1055
972
-1023
866
-1469
492
857
1954
1685
1046
-1748
-1480
Sample Output1
12
1
【题解】
对于区间的静态查询。要用前缀和的方法。
sum[i]=sum[i-1]+data[i];
然后处理出sum[0..n]注意要把sum[0]也处理出来。
然后把这n+1个sum从小到大或从大到小排序。排序完之后。可以保证序列最小和
就是min{abs(sum[i]-sum[i-1])}其中i∈(1..10);
因为排序之后相邻的sum值是最接近的。
然后要记录sum对应的i。
最大sum相同时。就让他们的差的绝对值最大就好。
如果全是正数则不用排序。因为sum会越来越大。。这样。
用__int64之后oj才让过了。。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
struct node //pos用于记录是哪一个位置的前缀和。
{
__int64 what;
int pos;
};
int n,maxl;
__int64 x, minn;
node sum[100001]; //用于存储前缀和。
void input_data()
{
scanf("%d", &n);
sum[0].what = 0; //前0个元素的和也要加进去。
sum[0].pos = 0; //不然没法单独取到第一个元素。
for (int i = 1; i <= n; i++) //输入n个数字记录前缀和
{
scanf("%I64d", &x); //这是__int64的输入格式。
sum[i].what = sum[i - 1].what + x;
sum[i].pos = i;
}
}
int cmp(const node &a, const node &b) //sort函数的对比函数
{
if (a.what < b.what)
return 1;
return 0;
}
int abs(int x) //返回x的绝对值。
{
return x < 0 ? -x : x;
}
void get_ans()
{
minn = sum[1].what; //一开始先处理最小值是第一个。
if (minn < 0)
minn = -minn;
maxl = sum[1].pos; //记录下他的长度。
for (int i = 2; i <= n; i++) //枚举每两个前缀和的差的绝对值
{
__int64 temp = sum[i].what - sum[i - 1].what;
int temp2 = abs(sum[i].pos - sum[i - 1].pos);
if (temp < minn) //尝试更新最小值。
{
minn = temp;
maxl = temp2;
}
else //如果相同则看是否长度更长
if (temp == minn && temp2 > maxl)
maxl = temp2;
}
}
void output_ans()
{
printf("%I64d\n", minn);
printf("%d", maxl);
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
input_data();
sort(sum + 0, sum + 1+n, cmp);//要对sum[0..n]都进行排序。
get_ans();
output_ans();
//fclose(stdin);
//fclose(stdout);
return 0;
}
【u207】最小值的更多相关文章
- C语言 · 最大值与最小值计算
输入11个整数,计算它们的最大值和最小值. 样例输入 0 1 2 3 4 5 6 7 8 9 10 样例输出 10 0 #include<stdio.h> int main(){ ]; ...
- [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- [LeetCode] Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- 整理:Javascript获取数组中的最大值和最小值的方法汇总
方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //最小值 Array.prototype.min = function ...
- 不需要sql进行计算数据的平均值、最大值、最小值、和
介绍下SqlServer.前端js.后台C#三个阶段对均值.最大值.最小值.和计算int[] jisuan = {0, 1, 3, 5, 7,8 }; List<int> jisuan2 ...
- call和apply求最大和最小值
,取最大值 var arr = [1,3,7,22,677,-1,2,70]; Math.max.apply(Math, arr);//677 Math.max.call(Math, 1,3,7,22 ...
- 【Oracle】oracle取最大值和最小值的几个方法汇总
(1)oracle使用keep分析函数取最值记录 -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 select deptno, empno, ename, sal, m ...
- 关于过拟合、局部最小值、以及Poor Generalization的思考
Poor Generalization 这可能是实际中遇到的最多问题. 比如FC网络为什么效果比CNN差那么多啊,是不是陷入局部最小值啊?是不是过拟合啊?是不是欠拟合啊? 在操场跑步的时候,又从SVM ...
- 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)
函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...
随机推荐
- 【习题 7-10 Uva11214】Guarding the Chessboard
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 可以想见最后深度不会很深吧.. 然后皇后之间互相攻击到是允许的.. 就这样 [代码] /* 1.Shoud it u ...
- 【编程】辨异 —— proxy 与 delegate
二者分别对应着设计模式中的代理模式和委托模式. proxy:译为代理, 被代理方(B)与代理方(A)的接口完全一致. 主要使用场景(语义)应该是:为简化编程(或无法操作B),不直接把请求交给被代理方( ...
- [置顶]
WebService学习总结(3)——使用java JDK开发WebService
一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...
- Java Web学习总结(14)——JSP基础语法
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- Altium Designer 在pcb下导入的原件引脚是绿的
当然也可能是其他规则原因导致的
- GO语言学习(九)Go 语言运算符
运算符用于在程序运行时执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细看看各个运算符的介绍. 算术运算符 下表 ...
- shiro简单配置(转)
注:这里只介绍spring配置模式. 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合.而且两种配置方法一样,只是格式不一样. 涉及的jar包 Jar包名称 版本 ...
- watchdog的正确使用方法
关于watchdog应该有过单片机学习经历的人.都比較熟悉.但watchdog的正确使用方法,恐怕大家假设没有经历过实际产品的开发不会有深入的理解. 瑞萨RL78系列的单片机自身带有watchdog, ...
- 如何把canvas元素作为网站背景总结详解
如何把canvas元素作为网站背景总结详解 一.总结 一句话总结:最简单的做法是绝对定位并且z-index属性设置为负数. 1.如何把canvas元素作为网站背景的两种方法? a.设置层级(本例代码就 ...
- C#实现人脸识别
C#实现基于ffmpeg加虹软的人脸识别 关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸识别开发库时,也横向对比了三种 ...