绝对值最小

来源:互联网 发布:淘宝手机端店铺装修 编辑:程序博客网 时间:2024/06/14 17:55

【Description】 

给你一个数组A[n],请你计算出ans=min(|A[i]+A[j]|)(0<=i,j<n)。例如:A={1, 4, -3},则:
|A[0] + A[0]| = |1 + 1| = 2
|A[0] + A[1]| = |1 + 4| = 5
|A[0] + A[2]| = |1 + (-3)| = 2
|A[1] + A[1]| = |4 + 4| = 8
|A[1] + A[2]| = |4 + (-3)| = 1
|A[2] + A[2]| = |(-3) + (-3)| = 6
所以ans=1。

【Input】

有多组测数数据,每组数据有两行,第一行包含一个正整数n(0<n<=100000),第二行包含n个整数,分别表示A[0], A[1], A[2], .... , A[n-1] (|A[i]|<2^30)。 输入以文件结束。

【Output】

对于每组数据,输出相应的答案。

【Sample Input】

3
1 4 -3
1
2
3
-1 -2 -5
3
1 2 3
2
0 5

【Sample Output】

1
4
2
2

0

【分析】和的绝对值最小有2种情况:元素全负或全非负,为绝对值最小元素的2倍;元素有正有负,为一正数和一负数之和。若是第一种情况,边输入边判断;否则,先对数组排序,从两头向中间比较,定义两个分别指向首尾的指针,当两数之和为正时说明正数较大,尾指针前移;当两数之和为负时,负数较大,首指针后移;两数之和为0,最小绝对值为0,无需再计算。

#include <iostream>#include <cmath>#include <vector>#include <algorithm>using namespace std;const int INF = 1000000000;vector<int> A;int main() {int n;while (cin >> n) {int minDist = INF, ai;for (int i = 0; i < n; i++) {cin >> ai;A.push_back(ai);if (fabs(2 * ai) < minDist) minDist = fabs(2 * ai);}stable_sort(A.begin(), A.end());int first = 0, last = n - 1, tmp;while (first != last) {tmp = A[last] + A[first];if (fabs(tmp) < minDist) minDist = fabs(tmp);if (tmp > 0) last--;else if (tmp < 0) first++;else {minDist = 0;break;}}cout << minDist << endl;A.clear();}return 0;}

0 0
原创粉丝点击