GDUT2012-1002最小差值

来源:互联网 发布:做电商美工有发展前景 编辑:程序博客网 时间:2024/05/22 10:46

最小差值

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 308   Accepted Submission(s) : 98

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

给出一个整数数组a1, a2, …, an,求数组中两个数的最小差值。即在数组中找 ai 和 aj ,使得 ai - aj 的值最小,并且 i < j。

Input

输入的第一行是一个整数T,表示有T组数据。1 <= T <= 50。
每组数据第一行输入一个整数n,第二行输入n个整数:a1,a2…,an。
1 <= T <= 50, 2 <= n <= 1000000, -1000000000 <= ai <= 1000000000。

Output

对于每组数据,输出一行,即最小差值。

Sample Input

321 133 2 046 8 -4 10

Sample Output

01-14

Author

cxyue



#include<iostream>#include<iomanip>#include<string.h>#include<stdio.h>using namespace std;long a[1000010];long b[1000010];long c[1000010];//开数组,a用来存数据,b用来从第二位开始的差值,c用来存从第二位开始前的最小值。/*小弟刚开始做这条题的时候,用cin,cout输入输出,还用memset来重置,导致超时4次。其实根本不需要memset,不过真得要用scanf,printf来防止超时。*//*不知道这个方法算不算动态规划····感觉好像是,因为主要参考了动态规划的思想去做*/int main( ){    int T,i;    long n,j;    long min;    while(scanf("%d",&T)!=EOF)    {        for(i=1;i<=T;++i)        {            scanf("%ld",&n);            min=1000000010;//最小值要定大一点。            for(j=1;j<=n;++j)            {                scanf("%ld",&a[j]);                if(j==2)                {                    c[j]=a[j-1];                }//从第二位开始找前面最少的数,那么第二位前面最少的一定是第一位。                if(j>2)                {                    if(a[j-1]<c[j-1])                    c[j]=a[j-1];                    else                    c[j]=c[j-1];                    //如果前一位的数字比前一位的前面最少的数还少,那么这一位前面最少的数肯定是这个数。                }                if(j>=2)                {                    b[j]=c[j]-a[j];                    if(b[j]<min)                    min=b[j];                    //将每一位数和前面最少的数的差值储存起来,再与最小值比较。其实可以不开b数组。无聊开了。                }            }            printf("%ld\n",min);        }    }    return 0;}