大体题意:
给你n 个数字,某一个数的幸运数是这个数前面比他小 离他最远的位置之差!
求出最大幸运值!(大体上这个意思!= = )
思路:
建立一个结构体,用来存数,有这个数的最小位置,和最大位置!然后按照数值排序!
然后从头枚举,这样做就符合了比他小的情况!
还要满足位置之差最远,那么直接让当前数的最大位置减去前面最小位置即可!
然后不断维护这个最小位置!
详细见代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 100000 + 10;
const int inf = 0x3f3f3f3f;
int vis[maxn];
int pos[maxn];
struct Node{
int v,id;
int maxid,minid;
bool operator < (const Node & rhs) const {
return v < rhs.v;
}
}p[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(vis,0,sizeof vis);
memset(pos,0,sizeof pos);
int n;
scanf("%d",&n);
int cnt = 0;
for (int i = 0; i < n; ++i){
int x;
scanf("%d",&x);
if (!vis[x]){
vis[x] = 1;
pos[x] = cnt;
p[cnt].maxid = -1;
p[cnt++].minid = inf;
}
int id = pos[x];
p[id].v = x;
p[id].maxid = max(p[id].maxid,i);
p[id].minid = min(p[id].minid,i);
}
sort(p,p+cnt);
int Minid = p[0].minid;
int ans = -1;
for (int i = 1; i < cnt; ++i){
ans = max(ans,p[i].maxid - Minid);
Minid = min(Minid,p[i].minid);
}
printf("%d\n",ans);
}
return 0;
}