题目
有 个果冻排成一排。第i个果冻的美味度是ai
天使非常喜欢吃果冻,但她想把最好吃的果冻留到最后收藏。天使想知道前 个果冻中,美味度第二大的果冻有多少美味度?
一共有 次询问。
注:如果最大的数有两个以上,默认第二大的等于最大的。例如, 这个序列,第二大的数是4。
链接:https://ac.nowcoder.com/acm/contest/11161/A
来源:牛客网
输入
5
1 2 5 3 5
4
2
3
4
5
输出
1
2
3
5
说明
前2个数,第二大的是1。
前3个数,第二大的是2。
前4个数,第二大的是3。
前5个数,第二大的是5。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x)
const double PI = acos(-1);
const int maxn = 100005;
typedef long long ll;
int a[maxn],pre[maxn],p[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
pre[0]=a[0];p[0]=0;
for(int i=1;i<n;i++){
pre[i]=max(a[i],pre[i-1]);
if(pre[i]==a[i]){
p[i]=pre[i-1];
}
else if(pre[i]==pre[i-1]){
p[i]=max(a[i],p[i-1]);
}
}
int t;
scanf("%d",&t);
while(t--){
int x;
scanf("%d",&x);
printf("%d\n",p[x-1]);
}
return 0;
}
一点想法
这道题看数据范围暴力sort肯定会炸掉。所以采用了前缀和的思想;
用pre[I]来存储前i个数据内最大的数,然后跑便利,如果满足1-x中某个数小于pre[i] (说明不是最大),并且大于前一个pre,那么说明就是第二大