two pointer 同时从天数和公里数开始找E,来减少运行时间。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b){
return a>=b;
}
int main(){
vector <int> vec;
int n, ETT,ETG, maxn=0, cnt, a, i;
int markT=0, markG=0; //等于1时为找到最大的E天数,为找到了最大的E公里。
scanf("%d",&n);
for(i=0; i<n; i++){
scanf("%d",&a);
vec.push_back(a);
}
sort(vec.begin(),vec.end(),cmp); //非升序排列vec
ETT=n; //ETT指向最大天数
ETG=vec[0]; //ETG指向最大公里数
while(markT!=1 || markG!=1){
if(markT!=1 && vec[ETT-1]>ETT){
maxn=maxn>ETT?maxn:ETT;
markT=1;
}else ETT--;
if(markG!=1 && ETG<=n && vec[ETG-1]>ETG){
maxn=maxn>ETG?maxn:ETG;
markG=1;
}else ETG--;
if(markT==1 && ETT > ETG) break;
if(markG==1 && ETT < ETG) break;
}
printf("%d",maxn);
}
转载须注明出处。