user-0 提问: 绝对值最小问题  求助！！！

回复:
user: user-1
content: 1)先排序，顺便去重复。 2)找到最大负数，0，最小正数； 3.分别处理 3.1)有0 返回0； 3.2)无正数返回最大负数的绝对值的二倍 3.3)无负数返回最小正数的二倍 3.4)有正负数，无0，先求出正和最小，负和绝对值最小，作为当前最小        根据正负数个数，       用数量少的集合，去逐个元素，二分查找绝对值相近的数据。       找到后，相邻两个数中，和的绝对值最小值。      逐个比较，求和比较，      比当前最小小的，的作为新前最小，大的扔掉。

user: user-1
content: 含有0，结果是0

user: user-1
content: 纯粹正数最小值的二倍，就是最小的 纯粹负数绝对值最小的绝对值的二倍，就是最小的 有正有负 分割成正数集合，负数集合 正数最小的二倍， 负数绝对值最小的的绝对值的二倍， 以及正负数和绝对值最小值，三者的最小值就是最小的。 这可以多次用二分查找找到。

user: user-2
content: 那个链接。。。挑战一直点不进去。。。

user: user-2
content: 引用 17 楼 u013037061 的回复:[quote=引用 16 楼 Falleyes 的回复:] 感觉你的算法复杂度较高，是n^2，我这个用了sort函数，先排序，然后对每两个数之间进行相加比较，最后再和最小元素的2倍比较。楼主的代码结果错误，可能是某些细节没有处理好。 刚开始没有看清题意，非常抱歉。以下代码满足现有的测试数据测试。 #include<iostream> #include<climits> #include<cstdlib> #include<algorithm> using namespace std;  int compare(const int& a, const int& b){ 	int x = abs(a), y = abs(b); 	return x < y ? 1 : 0; }  int main(){ 	int n; 	while (cin >> n){ 		if (n == 0){ 			cout << '0' << endl; 			continue; 		} 		if (n == 1){ 			cin >> n; 			cout << n + n << endl; 			continue; 		}  		int result = INT_MAX; 		int* num = new int[n];  		for (int i = 0; i < n; ++i) 			cin >> num[i];  		sort(num, num + n, compare); 		for (int i = 0; i < n - 1; ++i){ 			if (abs(num[i] + num[i + 1]) < abs(result)) 				result = num[i] + num[i + 1]; 		}  		if (result>2 * num[0]) 			result = 2 * num[0]; 		cout << abs(result) << endl; 		delete[] num; 	} } 楼主可以拿这个代码先测试下。 这个代码是不行的啊，http://student.csdn.net/mcs/programming_challenges  这是链接，层主可以去试试，1   2   3结果应该是2啊，，[/quote] 是吗？！我在vs上面尝试，确实1 2 3是2啊！

user: user-0
content: 引用 16 楼 Falleyes 的回复:感觉你的算法复杂度较高，是n^2，我这个用了sort函数，先排序，然后对每两个数之间进行相加比较，最后再和最小元素的2倍比较。楼主的代码结果错误，可能是某些细节没有处理好。 刚开始没有看清题意，非常抱歉。以下代码满足现有的测试数据测试。 #include<iostream> #include<climits> #include<cstdlib> #include<algorithm> using namespace std;  int compare(const int& a, const int& b){ 	int x = abs(a), y = abs(b); 	return x < y ? 1 : 0; }  int main(){ 	int n; 	while (cin >> n){ 		if (n == 0){ 			cout << '0' << endl; 			continue; 		} 		if (n == 1){ 			cin >> n; 			cout << n + n << endl; 			continue; 		}  		int result = INT_MAX; 		int* num = new int[n];  		for (int i = 0; i < n; ++i) 			cin >> num[i];  		sort(num, num + n, compare); 		for (int i = 0; i < n - 1; ++i){ 			if (abs(num[i] + num[i + 1]) < abs(result)) 				result = num[i] + num[i + 1]; 		}  		if (result>2 * num[0]) 			result = 2 * num[0]; 		cout << abs(result) << endl; 		delete[] num; 	} } 楼主可以拿这个代码先测试下。 这个代码是不行的啊，http://student.csdn.net/mcs/programming_challenges  这是链接，层主可以去试试，1   2   3结果应该是2啊，，

user: user-0
content: 引用 10 楼 Falleyes 的回复:1.你的程序执行顺序是先输入一个元素个数的整形，然后输入n个整形来填充数组。 2.然后如此反复执行1，直到你输入n为Ctrl+Z结束数据输入和处理 3.输出处理后的数组数据  在输入n的时候只要1次Ctrl+Z就可以 这个程序为啥显示是挑战失败啊！！！

user: user-0
content: 引用 11 楼 Falleyes 的回复:这是我测试的一组数据截图：  题目详情: 给你一个数组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. 输入描述： 有多组测数数据，每组数据有两行，第一行包含一个正整数n(0<n<=100000),第二行包含n个整数，分别表示A[0],A[1]，A[2],....,A[n-1]，（|A[i]|<2^30）。 输入以文件结束。 输出描述： 对于每组数据，输出相应的答案。   答题说明: 输入样例： 3 1 4 -3 1 2 3 -1 -2 -5 3 1 2 3 2 0 5 输出样例： 1 4 2 2 0

user: user-2
content: 感觉你的算法复杂度较高，是n^2，我这个用了sort函数，先排序，然后对每两个数之间进行相加比较，最后再和最小元素的2倍比较。楼主的代码结果错误，可能是某些细节没有处理好。 刚开始没有看清题意，非常抱歉。以下代码满足现有的测试数据测试。 #include<iostream> #include<climits> #include<cstdlib> #include<algorithm> using namespace std;  int compare(const int& a, const int& b){ 	int x = abs(a), y = abs(b); 	return x < y ? 1 : 0; }  int main(){ 	int n; 	while (cin >> n){ 		if (n == 0){ 			cout << '0' << endl; 			continue; 		} 		if (n == 1){ 			cin >> n; 			cout << n + n << endl; 			continue; 		}  		int result = INT_MAX; 		int* num = new int[n];  		for (int i = 0; i < n; ++i) 			cin >> num[i];  		sort(num, num + n, compare); 		for (int i = 0; i < n - 1; ++i){ 			if (abs(num[i] + num[i + 1]) < abs(result)) 				result = num[i] + num[i + 1]; 		}  		if (result>2 * num[0]) 			result = 2 * num[0]; 		cout << abs(result) << endl; 		delete[] num; 	} } 楼主可以拿这个代码先测试下。

user: user-2
content: 我给你写一个。。。

user: user-2
content: 这个其实就是求最小两个元素的和的绝对值最小，你没必要对所有元素两两相加比较，你只要找出离0最近的两个元素就可以了。 就你的代码来说，根本没有达到题目要求啊，比如我测试截图上的，1，2，3，那么得出结果应该是3，你却得出2.

user: user-3
content: 不贴代码版规何在？哈哈，只在在大牛心中！

user: user-2
content: 这是我测试的一组数据截图：

user: user-2
content: 1.你的程序执行顺序是先输入一个元素个数的整形，然后输入n个整形来填充数组。 2.然后如此反复执行1，直到你输入n为Ctrl+Z结束数据输入和处理 3.输出处理后的数组数据  在输入n的时候只要1次Ctrl+Z就可以

user: user-0
content: 引用 2 楼 boxmanstan 的回复:你是在死循环里做的，sleep（500）；试试 代码楼下，求指导！！！

user: user-0
content: 引用 1 楼 Falleyes 的回复:是不是你机子慢，才导致Ctrl+Z无效？新手可以贴代码的 在楼下贴了代码，求指导！！

user: user-0
content: #include <iostream> #include <cmath> using namespace std; int main() { 	int a[100000],n,i,b,j,min,l=0; 	int c[1000]; 	while(cin>>n) 	{ 		for(i=0;i<n;i++) 			cin>>a[i];	 		min=abs(a[0]+a[0]); 		for(i=0;i<n;i++) 			for(j=i;j<n;j++) 			{ 				b=abs(a[i]+a[j]); 				if(min>b) 					min=b; 			} 		c[l++]=min; 	} 	for(i=0;i<l;i++) 	{ 		cout<<c[i]<<endl; 	} 	return 0; }

user: user-4
content: 代码？  其实可以贴的

user: user-5
content: 引用 楼主 u013037061 的回复:开始我先编了一个当只输入一组数据时可以正确输出的程序，之后加入了while循环直到输入ctrl+z时停止循环，但是在dos下输入ctrl+z时，总得重复输入几次ctrl+z，才能得到几次答案，新手看版规，貌似不准贴代码，求高手指导，ctrl+z的用法，一直很纠结这个问题，网上貌似类似问题很少啊  贴代码是程序员的基本权利，任何版规都不能剥夺

user: user-6
content: 你是在死循环里做的，sleep（500）；试试