为了复活那些被灭霸消灭的人,复仇者去了以前的各个地方找无限宝石,而黑寡妇和鹰眼去了灵魂宝石的所在处。为了取得灵魂宝石,黑寡妇牺牲了。在复仇者把灭霸给杀死后,美队想要复活黑寡妇,于是拜托奇异博士想办法。奇异博士利用时间宝石寻找复活黑寡妇的办法。想要救黑寡妇就得去黑暗维度找到黑寡妇的灵魂给带回来即可复活。于是复仇者去了通往黑暗维度的大门,但是大门有个守卫。守卫有一道题需要复仇者解答,解答对了就可以打开通往黑暗维度的大门。题目:给你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 ") #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 ",y); for(int j=i+1;j<n;j++){ if(a[j]==-1){ printf("%d ",y); } if(a[j]>=x){ y=x;//遇到比最大的还大 x=a[j]; } if(a[j]>y&&a[j]<x){ y=a[j];//遇到比最大的小比此大的大 } } return 0; }