题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272
题解:
本题上面虽然说要用单调队列或者单调栈来写,但是我自己使用贪心的方法来的。
先对所有的数字进行从小到大的排序,然后再对位置进行升序的方法。
好处:对于数字进行了升序之后,保证这些数字的使用都是满足条件的,之后就很简单了,只要一直维护一个最大的位置值就行了。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 5*1e4+10;
struct node
{
int num;
int pos;
}s[maxn];
int cmp(node a,node b)
{
if(a.num!=b.num)
return a.num<b.num;
return a.pos< b.pos;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>s[i].num;
s[i].pos=i;
}
sort(s,s+n,cmp);
int ans=0;
int small=s[0].pos;
for(int i=1;i<n;i++)
{
if(s[i].pos>small)
ans=max(ans,s[i].pos-small);
else
small=s[i].pos;
}
cout<<ans<<endl;
}
}