hpuoj 绝对值问题

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

                                        

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]);
            else
        printf("%d\n",a[p]);
        }
        return 0;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值