序言 仅作为自己的学习笔记,同时欢迎大家交流
题目描述
有 个果冻排成一排。第 i个果冻的美味度是 a【i】。
天使非常喜欢吃果冻,但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中,美味度第二大的果冻有多少美味度?
一共有 q次询问。
注:如果最大的数有两个以上,默认第二大的等于最大的。例如,【2,4,3,4】 这个序列,第二大的数是4。
输入描述
第一行一个正整数n
第二行n个正整数a[i],用空格隔开。
第三行一个正整数q
接下来q行,每行一个正整数x,代表一次询问。
数据范围1<=n,q<=1e5,1<=a[i]<=1e9,2<=x<=n
输出描述
输出 q行,每行一个正整数,代表一次询问,输出前x个果冻中美味度第二大的值。
示例
输入
5
1 2 5 3 5
4
2
3
4
5
输出
1
2
3
5
- 首先解释这个题目属于一个比赛中的签到题,然后题主目前比较菜,所以这个题没做出来,整理笔记,记录思路。
- 一开始,我是计划直接每次询问后进行判断的循环,但无法通过全部的测试样例,也不报超时,当时就很疑惑,最终也未发现错误。
- 赛后总结看了看他人的代码,发现了更优化的解决方案:多建立一个数组,然后将前x个的数据中第二大的那个数存入i-1的位置里,询问的时候直接查找就可以了,当然也可以用树状数组,在此就不再过多赘述了。
#include<iostream>
using namespace std;
const int N =1e5+10;//多开辟一点空间,防止数组越界
int a[N],b[N];//全局变量声明自动初始化为0
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int max1=a[0],max2=a[1];//直接令前两个数为第一大和第二大
if(a[0]<a[1])
{
max1=a[1];
max2=a[0];
b[1]=a[0];
}
else b[1]=a[1];
//上面进行真实地判断谁第二大并将其存入b数组
for(int i=2;i<n;i++)
{
if(a[i]>max1)
{
max2=max1;
max1=a[i];
}
else if (a[i]>max2)
{
max2=a[i];
}
b[i]=max2;
}
//上面进行判断前x个数据中第二大分别是多少,并将其存入b[x-1]
int q,x;
cin>>q;
while(q--)
{
cin>>x;
cout<<b[--x]<<endl;//每次询问后输出
}
return 0;
}