天使的果冻【牛客】

序言 仅作为自己的学习笔记,同时欢迎大家交流
题目描述
有 个果冻排成一排。第 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
  1. 首先解释这个题目属于一个比赛中的签到题,然后题主目前比较菜,所以这个题没做出来,整理笔记,记录思路。
  2. 一开始,我是计划直接每次询问后进行判断的循环,但无法通过全部的测试样例,也不报超时,当时就很疑惑,最终也未发现错误。
  3. 赛后总结看了看他人的代码,发现了更优化的解决方案:多建立一个数组,然后将前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;
 } 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值