1205 Problem C求次大值

来源:互联网 发布:股票网络销售违法嘛 编辑:程序博客网 时间:2024/06/09 19:44

题目描述

给出你n个数,你的任务就是求出这些数的次大值。那么你会做吗????

输入

 有多组数据,每组输出一个n(n<=10^5),然后有n个数据(int范围内)。

输出

每组输出一个次大值。

样例输入

33 2 161 2 3 4 5 6

样例输出

25

提示

不会出现最大值和次大值相同的情况。

这题不能使用冒泡排序对立面的所有元素进行全部排序,因为那样会非常耗时间。

方法一:其实,我们只需要使用冒泡排序排两次序就行了,第一轮可以找出最大值,那么第二轮就可以找出次大值了。

#include<stdio.h>
int main()
{
    int n,i,j,t;
    while(~scanf("%d",&n))
    {
        int a[n];
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0;i<2;i++)
        {
            for(j=0;j<n-1-i;j++)
            {
                if(a[j]>a[j+1])
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
        printf("%d\n",a[n-2]);
    }
}
 
/**************************************************************
    Problem: 1205
    User: 171530425
    Language: C
    Result: 正确
    Time:88 ms
    Memory:1364 kb
****************************************************************/

方法二:我们还可以设置一个初始值非常小的变量,让它保存最大值,然后再定义一个初始值非常小的变量,让它与所有元素进行比较,并且求出除了最大值以外的最大值,也即是次大值

#include<stdio.h>
void main(){
    int n,i,j,t,f;
    while(~scanf("%d",&n)){
        int a[n];
        f=-65536;
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(a[i]>f){
                f=a[i];
            }
        }
        t=-65536;
        for(i=0;i<n;i++){
            if(a[i]>t&&a[i]!=f){
                t=a[i];
            }
        }
        printf("%d\n",t);
    }
}
 
/**************************************************************
    Problem: 1205
    User: 171530425
    Language: C
    Result: 正确
    Time:88 ms
    Memory:1360 kb
****************************************************************/