给定n个数,a[1]到a[n],请你帮忙找出a[i] - a[j]的最大值,其中1 <= i < j <= n.
标签:
给定n个数,a[1]到a[n],请你帮忙找出a[i] - a[j]的最大值,其中1 <= i < j <= n.
第一行一个数T,表示一共有T组数据(T <= 20); 每组测试数据第一行一个整数n(2 <= n <= 10 ^ 5),表示接下来有n个数,第二行n个整数,不超过10 ^ 6,中间用空格隔开。
每组数据输出一行,表示最大值是多少。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 const int MAXN=1e5+100; 8 int main(){ 9 int T,N; 10 scanf("%d",&T); 11 while(T--){ 12 scanf("%d",&N); 13 int x,px,ans=-1e7; 14 scanf("%d",&x); 15 px=x; 16 for(int i=1;i<N;i++){ 17 scanf("%d",&x); 18 ans=max(ans,px-x); 19 if(x>px)px=x; 20 } 21 printf("%d\n",ans); 22 } 23 return 0; 24 }
自己的二分超时代码。。。。纯属无用工。。。肯定超时了。。。
//#include<bits/stdc++.h> #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace std; const int MAXN=1e5+100; int m[MAXN]; vector<int>vec; typedef vector<int>::iterator ITE; ITE erfen(ITE a,ITE b,int x){ int mid,l=0,r=b-a; while(l<r){ mid=(r-l)/2; if(vec[mid]>=x)r=mid-1; else l=mid+1; } return a+l; } int main(){ int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); int mx,ans=-1e7; vec.clear(); for(int i=0;i<n;i++){ scanf("%d",m+i); if(i){ mx=vec[vec.size()-1]; // printf("%d\n",mx); ans=max(ans,mx-m[i]); } vector<int>::iterator iter; iter=erfen(vec.begin(),vec.end(),m[i]); if(iter==vec.end())vec.push_back(m[i]); else *iter=m[i]; } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4985556.html