当前位置: 代码迷 >> 综合 >> 算法周周练15
  详细解决方案

算法周周练15

热度:61   发布时间:2024-01-29 15:36:33.0

A-数列下标

题意:给你一个序列A,求出一个数列B.

其中Bi表示数列A中Ai右边第一个比Ai大的数的下标(从1开始计数),没有找到这一个下标 Bi 就为0

样例输入:

6
3 2 6 1 1 2 

输出:

3 3 0 6 6 0 

题意解读:

从当前下标开始数

第一个比3大的数是6,B为3

第一个比2大的数是6,B为3

没有比6大的数,         B为0

第一个比1大的数为2,B为6

第一个比1大的数为2,B为6

没有比2大的数             B为0

因此B数列为{3 3 0 6 6 0}

hint:可以直接套用单调栈,需要求第一个比ai大的数,那么从后往前遍历,并运用单调递减栈,如果栈大小不为0的时候,栈顶就是所求的B,如果栈大小为0,就说明i到n并没有比Ai更大的数了,因此B为0

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
typedef long long LL;
stack<int>s;//栈存放的是下标
int a[N],b[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=n;i>=1;i--){while(s.size()&&a[s.top()]<=a[i])s.pop();if(s.size())b[i]=s.top();else b[i]=0;s.push(i);}for(int i=1;i<=n;i++){if(i!=1)cout<<" ";cout<<b[i];}system("pause");return 0;
}

 

  相关解决方案