A-天使果冻

题目

有 个果冻排成一排。第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,那么说明就是第二大

猜你喜欢

转载自blog.csdn.net/DAVID3A/article/details/115016829