NYOJ 837 S+T

S + T

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

   给你一个长度为n的整数序列A1,A2,……,An,找出两个整数Ai和Aj(i<j),使得Ai-Aj尽量大。

输入
输入第一行为数据组数T(T<=100)。每组数据的第一行为整数的个数n(2<=n<=100000);一下n行,每行为一个绝对值不超过150000的正整数。(所有的数据都不超过2^64 - 1)
输出
对于每组数据,输出Ai –Aj的最大值、i值和j值。(如果有多个最大值,则输出先出现的最大值和i,j值)
样例输入
235 2 162 3 6 2 1 -1
样例输出
4 1 37 3 6
提示

如果你认为数据太大,则本OJ推荐使用long long


解:一看到10W的整数就明白此题解题复杂度应该为O(n),不然肯定会超时,起初写的时候写了之后无限wa,后来被迫无奈下看了后台数据,才明白自己的错误处,,好失败。。。


01. #include<stdio.h>
02. int main()
03. {
04. int N;
05. scanf("%d",&N);
06. while(N--)
07. {
08. long long i,n,x,maxx,minn,maxi=1,jj,mini=2,cha,j=1;
09. scanf("%lld",&n);
10. scanf("%lld",&maxx);
11. scanf("%lld",&minn);
12. jj=maxx,cha=maxx-minn;
13. if(maxx<minn)
14. jj=minn,j=2;
15. for(i=3; i<=n; i++)
16. {
17. scanf("%lld",&x);
18. if(jj-x>cha)
19. maxx=jj,maxi=j,minn=x,mini=i,cha=jj-x;
20. if(x>jj)
21. jj=x,j=i;
22. }
23. printf("%lld %lld %lld\n",cha,maxi,mini);
24. }
25. }

即先把最大值以及差值最大值存一下,若差值大于原来的差值最大值,则立即更换最大值,最大差值以及其下标。


首次做的时候20行写成了if(x>maxx)

不管咋样都不明白错在了哪里,还以为是oj的原因,-_-|||

题wa了一定是自己的原因,一定要把握每个程序,不留漏洞!

你可能感兴趣的:(nyoj日常小练)