次大值

为了复活那些被灭霸消灭的人,复仇者去了以前的各个地方找无限宝石,而黑寡妇和鹰眼去了灵魂宝石的所在处。为了取得灵魂宝石,黑寡妇牺牲了。在复仇者把灭霸给杀死后,美队想要复活黑寡妇,于是拜托奇异博士想办法。奇异博士利用时间宝石寻找复活黑寡妇的办法。想要救黑寡妇就得去黑暗维度找到黑寡妇的灵魂给带回来即可复活。于是复仇者去了通往黑暗维度的大门,但是大门有个守卫。守卫有一道题需要复仇者解答,解答对了就可以打开通往黑暗维度的大门。题目:给你n个数,如果给你的数是-1,你就要说出已输入的数中第二大的值。现在复仇者对这个题毫无办法,你能帮复仇者解决这个问题吗?帮复仇者复活黑寡妇。

 

输入

第一行给一个正整数n,(-1<=n<=2e7) 第二行给出n个正整数a1,a2,a3,…an(-1<=ai<=1e9)。

输出

如果ai=-1,就输出第二大的值,一个输出占一行

样例输入 Copy

10
10 0 5 -1 12 3 8 -1 -1 9

样例输出 Copy

5
10
10

提示

解题思路:如果每一次都排序的话会超时,所以可以模拟做,
先在找到第一个-1,对第一个-1前的所有数进行排序,找最大值x,和次大值y,
再扫描数组如果遇到a[i]>=x,则a[i]赋值给x,x赋值给y;如果遇到a[i]大于y小于x,则a[i]赋值给y;
AC代码:
#include "bits/stdc++.h"
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
  
const int maxn = 1e9+7;
const int inf = 0x3f3f3f3f;
const int mod = 1e8+7;
int main()
{
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int i;
    for(i=0;i<n;i++){
        if(a[i]==-1)
        break;    
    }
    sort(a,a+i);
    int x=a[i-1];//当前最大
    int y=a[i-2];//当前次大 
    printf("%d\n",y);
    for(int j=i+1;j<n;j++){
        if(a[j]==-1){
            printf("%d\n",y);
        }
        if(a[j]>=x){
            y=x;//遇到比最大的还大
            x=a[j];
        }
        if(a[j]>y&&a[j]<x){
            y=a[j];//遇到比最大的小比此大的大
        }
    }
     return 0;
}

猜你喜欢

转载自www.cnblogs.com/lipu123/p/12163506.html