zoukankan      html  css  js  c++  java
  • CSDN挑战编程——《绝对值最小》

    绝对值最小

    题目详情:

    给你一个数组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


    /*
    	解题思路:
    		对数组进行高速排序(排序后能够降低枚举的次数),然后枚举求解 
    */
    #include "stdio.h"
    #include "stdlib.h"
    
    #define abs(x)  ((x)>0?

    (x):-1*(x)) #define maxn 100000+10 int a[maxn],n; int cmp(const void* _a,const void* _b){ int *a=(int *)_a; int *b=(int *)_b; return (*a-*b); } int main() { int ans; while(scanf("%d",&n)&&n>0) { int flag=1; for(int i=0;i<n;i++){ scanf("%d",&a[i]); if(!a[i]){ ans=0; flag=0; } } if(flag){ qsort((void *)a, n, sizeof(int), cmp); ans=abs(a[0]*2); for(int i=0;i<n;i++){ int min=abs(2*a[i]); for(int j=i+1,tmp;j<n;j++){ tmp=abs(a[i]+a[j]); if(tmp<min){ min=tmp; }else{ //不存在比min更小的解,退出内循环 break; } } if(min<ans) ans=min; } } printf("%d ",ans); } return 0; }


                  代码超时的说。求高手指点,感激不尽


     CSDN挑战编程交流群:372863405         

  • 相关阅读:
    How to change hostname on SLE
    How to install starDIct on suse OS?
    python logging usage
    How to reset password for unknow root
    How to use wget ?
    How to only capute sub-matched character by grep
    How to inspect who is caller of func and who is the class of instance
    How to use groovy script on jenkins
    Vim ide for shell development
    linux高性能服务器编程 (二) --IP协议详解
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6888637.html
Copyright © 2011-2022 走看看