题目大意:
题目链接:https://www.luogu.org/problemnew/show/P2947
给出条线段,输出每条线段前面比它高并且离他最近的线段。
思路:
最简单的暴力方法,枚举,预期得分50。
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
if(a[i]<a[j])
{
ans[i]=j;
break;
}
这道题和 糟糕的一天 十分相似,也是单调栈。每次读入一个数就用它去匹配之前的读入(储存在栈里面),并且掉。最终答案储存在 数组里。
代码:
#include <cstdio>
#include <stack>
using namespace std;
int n,ans[100001],a[100001];
stack<int> q;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
while (q.size()&&a[q.top()]<a[i]) //栈里还有元素且比读入小
{
ans[q.top()]=i; //储存答案
q.pop(); //只要找最近的答案,找到就可以pop了
}
q.push(i);
}
for (int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}