【51nod】【贪心】最大距离
题目
解题思路
先将数从小到大排序
然后将数一个一个处理删去
维护最右边仍存在的数的位置减去当前数的位置,答案取最大值
因为从小到大排序所以存在的数一定会大于等于当前数
单调栈 我没打。。。
从小到大排序,将原有位置丢到单调栈中维护
如果前面的位置比当前的大,说明不构成一对,将前面的退栈
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
struct lzf{
int x,id;
}a[50010];
int n,ans,r,b[50010];
bool cmp(lzf l,lzf y)
{
if (l.x!=y.x) return l.x<y.x;
return l.id<y.id;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
a[i].x=b[i];
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
r=n;
for (int i=1;i<=n;i++)
{
while (b[r]==0) r--;
ans=max(ans,r-a[i].id);
b[a[i].id]=0;
}
printf("%d",ans);
return 0;
}