牛客对应题目链接:天使果冻 (nowcoder.com)
一、分析题目
预处理 + 递推 / 动态规划
- f[i]:表示前 i 个数中的最大值。
- g[i]:表示前 i 个数中的第二大的值。
状态转移方程:
- f[i] = max(f[i-1], arr[i]);
- arr[i] >= f[i-1]:g[i] = f[i-1]
- f[i-1] > arr[i] >= g[i-1]:g[i] = arr[i]
二、代码
#include <iostream>
using namespace std;
const int N=1e5+10;
int arr[N];
int f[N], g[N];
int main()
{
int n;
cin >> n;
for(int i=1; i<=n; i++) cin >> arr[i];
f[1]=arr[1], g[1]=0;
for(int i=2; i<=n; i++)
{
int x=arr[i];
f[i]=max(f[i-1], arr[i]);
if(x>=f[i-1]) g[i]=f[i-1];
else if(x>=g[i-1] && x<f[i-1]) g[i]=x;
else g[i]=g[i-1];
}
int q;
cin >> q;
while(q--)
{
int x;
cin >> x;
cout << g[x] << endl;
}
return 0;
}
三、反思与改进
部分思路正确,但没有进行分类讨论,且用一个数组来保存当前询问的前 x 个数中的次大值。