当前位置: 代码迷 >> 综合 >> hpuoj 绝对值问题
  详细解决方案

hpuoj 绝对值问题

热度:27   发布时间:2023-11-26 10:13:28.0

       菜鸟最近在水题,总是觉得没有做水题的必要了,但是经历过那次个人赛之后,才突然的醒悟,自己做水题的速度好慢好慢啊(当然那天也是特殊原因了.....但是这也不能成为懒惰的理由啊),那天连女生的水平都不及,好伤心啊~~~,然后就开始各种怀疑自己的能力怎么怎么样啊,把自己的信心都弄没了。所以本菜鸟决定再刷一波水题(当然水题并不是像学长说的那样,一点用处没有的,水题中往往包含了一些零散的知识点,用来练速度),以此来提高自己的编程水平。

                                        

1291: 绝对值问题 [水题]点击打开链接

时间限制: 1 Sec  内存限制: 128 M

题目描述

AC最近学C语言,而他表弟在学排序,现在他表弟给他出了道题,要求他编一个程序,找出绝对值最小的元素。

PS:绝对值可以相等,但输入的数据不相等,如果绝对值相等,输出大的数。

输入

第一行输入一个整数T,代表有T组测试数据。

每组数据占两行,第一行输入一个整数N,代表有N个整数。

接下来一行输入N个整数a。

所有数据都在int范围内。

输出

对每组测试数据,输出一个整数

样例输入

2
3
-1 -2 0
6
-1 -2 -3 1 2 3

样例输出

0
1

这题其实很简单的,题目上说了,求绝对值,然后输出绝对值最小的那个数,如果绝对值最小的数有两个的话,输出大的那个数,比如:

                               

                      -1     -2     -3    1    2     3


全部求绝对值:


                       1      1      2     2     3    3


绝对值最小的有两个,输出大的那个数(注意这里输出的是原来的数,比如-1,-2,-3,绝对值最小的数是-1,而这个-1呢就是原来的数,不是求过绝对值以后的数),这里就是输出的是1(注意这个1不是求过绝对值以后的1,是原来的1,是一个小陷阱);思路就是可以先全部求绝对值(abs是int型的,也就是我们说的整数,而fabs则是double型的,也就是实数;这里还要注意的是abs在C里的头文件是“stdlib.h”,而在C++里的则是“cstdlib”;而fabs则是在“math.h”在C++里则是“cmath”);然后定义个数组储存起来,然后做个标记,最后求解。下面是我的代码:


   #include<cstdio>#include<cstdlib>using namespace std; int main(){int T,N,min=0,i;int a[101],b[101];scanf("%d",&T);while(T--){int p=0,flag=0,k,temp=0,j;scanf("%d",&N);for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<N;i++){b[i]=abs(a[i]);//把求的绝对值储存的新数组里}for(i=1;i<N;i++){ for(j=0;j<N-i;j++){if(b[j]>b[j+1]){temp=b[j];b[j]=b[j+1];b[j+1]=temp;}//可以用sort排序,更快捷}min=b[0];}for(i=0;i<N;i++){if(min==a[i]){flag=1;//做标记,a[i]为原来的数据k=i;//记录下这个数据储存在数组中的位置}}     if(flag==1)printf("%d\n",a[k]);elseprintf("%d\n",a[p]);}return 0;} 

 方法是有点麻烦,复杂度也比较高,还有优化的余地~~