绝对值最小问题 求助!!!

小马521 2014-05-08 10:45:01
开始我先编了一个当只输入一组数据时可以正确输出的程序,之后加入了while循环直到输入ctrl+z时停止循环,但是在dos下输入ctrl+z时,总得重复输入几次ctrl+z,才能得到几次答案,新手看版规,貌似不准贴代码,求高手指导,ctrl+z的用法,一直很纠结这个问题,网上貌似类似问题很少啊
...全文
259 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-05-15
  • 打赏
  • 举报
回复
1)先排序,顺便去重复。 2)找到最大负数,0,最小正数; 3.分别处理 3.1)有0 返回0; 3.2)无正数返回最大负数的绝对值的二倍 3.3)无负数返回最小正数的二倍 3.4)有正负数,无0,先求出正和最小,负和绝对值最小,作为当前最小 根据正负数个数, 用数量少的集合,去逐个元素,二分查找绝对值相近的数据。 找到后,相邻两个数中,和的绝对值最小值。 逐个比较,求和比较, 比当前最小小的,的作为新前最小,大的扔掉。
lm_whales 2014-05-15
  • 打赏
  • 举报
回复
含有0,结果是0
lm_whales 2014-05-15
  • 打赏
  • 举报
回复
纯粹正数最小值的二倍,就是最小的 纯粹负数绝对值最小的绝对值的二倍,就是最小的 有正有负 分割成正数集合,负数集合 正数最小的二倍, 负数绝对值最小的的绝对值的二倍, 以及正负数和绝对值最小值,三者的最小值就是最小的。 这可以多次用二分查找找到。
Falleyes 2014-05-15
  • 打赏
  • 举报
回复
那个链接。。。挑战一直点不进去。。。
Falleyes 2014-05-15
  • 打赏
  • 举报
回复
引用 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啊!
小马521 2014-05-15
  • 打赏
  • 举报
回复
引用 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啊,,
小马521 2014-05-10
  • 打赏
  • 举报
回复
引用 10 楼 Falleyes 的回复:
1.你的程序执行顺序是先输入一个元素个数的整形,然后输入n个整形来填充数组。 2.然后如此反复执行1,直到你输入n为Ctrl+Z结束数据输入和处理 3.输出处理后的数组数据 在输入n的时候只要1次Ctrl+Z就可以
这个程序为啥显示是挑战失败啊!!!
小马521 2014-05-10
  • 打赏
  • 举报
回复
引用 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
Falleyes 2014-05-10
  • 打赏
  • 举报
回复
感觉你的算法复杂度较高,是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;
	}
}
楼主可以拿这个代码先测试下。
Falleyes 2014-05-10
  • 打赏
  • 举报
回复
我给你写一个。。。
Falleyes 2014-05-10
  • 打赏
  • 举报
回复
这个其实就是求最小两个元素的和的绝对值最小,你没必要对所有元素两两相加比较,你只要找出离0最近的两个元素就可以了。 就你的代码来说,根本没有达到题目要求啊,比如我测试截图上的,1,2,3,那么得出结果应该是3,你却得出2.
Uron 2014-05-09
  • 打赏
  • 举报
回复
不贴代码版规何在?哈哈,只在在大牛心中!
Falleyes 2014-05-09
  • 打赏
  • 举报
回复
这是我测试的一组数据截图:
Falleyes 2014-05-09
  • 打赏
  • 举报
回复
1.你的程序执行顺序是先输入一个元素个数的整形,然后输入n个整形来填充数组。 2.然后如此反复执行1,直到你输入n为Ctrl+Z结束数据输入和处理 3.输出处理后的数组数据 在输入n的时候只要1次Ctrl+Z就可以
小马521 2014-05-09
  • 打赏
  • 举报
回复
引用 2 楼 boxmanstan 的回复:
你是在死循环里做的,sleep(500);试试
代码楼下,求指导!!!
小马521 2014-05-09
  • 打赏
  • 举报
回复
引用 1 楼 Falleyes 的回复:
是不是你机子慢,才导致Ctrl+Z无效?新手可以贴代码的
在楼下贴了代码,求指导!!
小马521 2014-05-09
  • 打赏
  • 举报
回复
#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; }
lied 2014-05-09
  • 打赏
  • 举报
回复
代码? 其实可以贴的
buyong 2014-05-09
  • 打赏
  • 举报
回复
引用 楼主 u013037061 的回复:
开始我先编了一个当只输入一组数据时可以正确输出的程序,之后加入了while循环直到输入ctrl+z时停止循环,但是在dos下输入ctrl+z时,总得重复输入几次ctrl+z,才能得到几次答案,新手看版规,貌似不准贴代码,求高手指导,ctrl+z的用法,一直很纠结这个问题,网上貌似类似问题很少啊
贴代码是程序员的基本权利,任何版规都不能剥夺
杀意已决 2014-05-09
  • 打赏
  • 举报
回复
你是在死循环里做的,sleep(500);试试
加载更多回复(2)

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧