Как найти второй максимум массива

Is it possible to find the second maximum number from an array of integers by traversing the array only once?

As an example, I have a array of five integers from which I want to find second maximum number. Here is an attempt I gave in the interview:

#define MIN -1
int main()
{
    int max=MIN,second_max=MIN;
    int arr[6]={0,1,2,3,4,5};
    for(int i=0;i<5;i++){
        cout<<"::"<<arr[i];
    }
    for(int i=0;i<5;i++){
        if(arr[i]>max){
            second_max=max;
            max=arr[i];          
        }
    }
    cout<<endl<<"Second Max:"<<second_max;
    int i;
    cin>>i;
    return 0;
}

The interviewer, however, came up with the test case int arr[6]={5,4,3,2,1,0};, which prevents it from going to the if condition the second time.
I said to the interviewer that the only way would be to parse the array two times (two for loops). Does anybody have a better solution?

codaddict's user avatar

codaddict

443k81 gold badges491 silver badges528 bronze badges

asked Mar 6, 2010 at 14:03

Xinus's user avatar

2

Your initialization of max and second_max to -1 is flawed. What if the array has values like {-2,-3,-4}?

What you can do instead is to take the first 2 elements of the array (assuming the array has at least 2 elements), compare them, assign the smaller one to second_max and the larger one to max:

if(arr[0] > arr[1]) {
 second_max = arr[1];
 max = arr[0];
} else {
 second_max = arr[0];
 max = arr[1];
}

Then start comparing from the 3rd element and update max and/or second_max as needed:

for(int i = 2; i < arr_len; i++){
    // use >= n not just > as max and second_max can hav same value. Ex:{1,2,3,3}   
    if(arr[i] >= max){  
        second_max=max;
        max=arr[i];          
    }
    else if(arr[i] > second_max){
        second_max=arr[i];
    }
}

answered Mar 6, 2010 at 14:15

codaddict's user avatar

codaddictcodaddict

443k81 gold badges491 silver badges528 bronze badges

4

The easiest solution would be to use std::nth_element.

answered Mar 6, 2010 at 14:06

avakar's user avatar

avakaravakar

31.8k9 gold badges65 silver badges102 bronze badges

9

You need a second test:

 for(int i=0;i<5;i++){  
   if(arr[i]>max){  
     second_max=max;  
     max=arr[i];            
   }
   else if (arr[i] > second_max && arr[i] != max){
     second_max = arr[i];
   }
 }

answered Mar 6, 2010 at 14:08

Anders Abel's user avatar

Anders AbelAnders Abel

67.7k17 gold badges150 silver badges217 bronze badges

3

Your original code is okay, you just have to initialize the max and second_max variables. Use the first two elements in the array.

answered Mar 6, 2010 at 14:34

Hans Passant's user avatar

Hans PassantHans Passant

917k145 gold badges1680 silver badges2521 bronze badges

Here you are:

std::pair<int, int> GetTwoBiggestNumbers(const std::vector<int>& array)
{
    std::pair<int, int> biggest;
    biggest.first = std::max(array[0], array[1]);  // Biggest of the first two.
    biggest.second = std::min(array[0], array[1]); // Smallest of the first two.

    // Continue with the third.
    for(std::vector<int>::const_iterator it = array.begin() + 2;
        it != array.end();
        ++it)
    {
        if(*it > biggest.first)
        {
            biggest.second = biggest.first;
            biggest.first = *it;
        }
        else if(*it > biggest.second)
        {
            biggest.second = *it;
        }
    }

    return biggest;
}

answered Mar 6, 2010 at 14:14

Johann Gerell's user avatar

Johann GerellJohann Gerell

24.9k10 gold badges72 silver badges122 bronze badges

7

Quickselect is the way to go with this one. Pseudo code is available at that link so I shall just explain the overall algorithm:

QuickSelect for kth largest number:
    Select a pivot element
    Split array around pivot
    If (k < new pivot index)
       perform quickselect on left hand sub array
     else if (k > new pivot index)
       perform quickselect on right hand sub array (make sure to offset k by size of lefthand array + 1)
     else
       return pivot

This is quite obviously based on the good old quicksort algorithm.

Following this algorithm through, always selecting element zero as the pivot every time:

select 4th largest number:
1) array = {1, 3, 2, 7, 11, 0, -4}
partition with 1 as pivot
{0, -4, _1_, 3, 2, 7, 11}
4 > 2 (new pivot index) so...

2) Select 1st (4 - 3) largest number from right sub array
array = {3, 2, 7, 11}
partition with 3 as pivot
{2, _3_, 7, 11}
1 < 2 (new pivot index) so...

3) select 1st largest number from left sub array
array = {2}

4) Done, 4th largest number is 2

This will leave your array in an undefined order afterwards, it’s up to you if that’s a problem.

answered Mar 6, 2010 at 18:09

Martin's user avatar

MartinMartin

12.4k12 gold badges64 silver badges128 bronze badges

Step 1. Decide on first two numbers.
Step 2. Loop through remaining numbers.
Step 3. Maintain latest maximum and second maximum.
Step 4. When updating second maximum, be aware that you are not making maximum and second maximum equal.

Tested for sorted input (ascending and descending), random input, input having duplicates, works fine.

#include <iostream>
#define MAX 50
int GetSecondMaximum(int* data, unsigned int size)
{
    int max, secmax;
    // Decide on first two numbers
    if (data[0] > data[1])
    {
        max = data[0];
        secmax = data[1];
    }
    else
    {
        secmax = data[0];
        max = data[1];
    }
    // Loop through remaining numbers
    for (unsigned int i = 2; i < size; ++i)
    {
        if (data[i] > max)
        {
            secmax = max;
            max = data[i];
        }
        else if (data[i] > secmax && data[i] != max/*removes duplicate problem*/)
            secmax = data[i];
    }
    return secmax;
}
int main()
{
    int data[MAX];
    // Fill with random integers
    for (unsigned int i = 0; i < MAX; ++i)
    {
        data[i] = rand() % MAX;
        std::cout << "[" << data[i] << "] "; // Display input
    }
    std::cout << std::endl << std::endl;
    // Find second maximum
    int nSecondMax = GetSecondMaximum(data, MAX);
    // Display output
    std::cout << "Second Maximum = " << nSecondMax << std::endl;
    // Wait for user input
    std::cin.get();
    return 0;
}

answered Mar 6, 2010 at 18:39

Rajendra Uppal's user avatar

Rajendra UppalRajendra Uppal

18.9k15 gold badges59 silver badges57 bronze badges

Other way to solve this problem, is to use comparisons among the elements. Like for example,

a[10] = {1,2,3,4,5,6,7,8,9,10}

Compare 1,2 and say max = 2 and second max = 1

Now compare 3 and 4 and compare the greatest of them with max.

if element > max
     second max = max
     element = max
else if element > second max
     second max = element

The advantage with this is, you are eliminating two numbers in just two comparisons.

Let me know, if you have any problem understanding this.

answered Mar 7, 2010 at 6:19

Boolean's user avatar

BooleanBoolean

14.2k30 gold badges88 silver badges129 bronze badges

1

Check this solution.

max1 = a[0];
max2 = a[1];

for (i = 1; i < n; i++)
{
    if (max1 < a[i])
    {
        max2 = max1;
        max1 = a[i];
    }

    if (max2 == max1) max2 = a[i + 1];

    if (max2 == a[n])
    {
        printf("All numbers are the same no second max.n");
        return 0;
    }

    if (max2 < a[i] && max1 != a[i]) max2 = a[i];
}

Mario S's user avatar

Mario S

11.7k24 gold badges38 silver badges47 bronze badges

answered Oct 16, 2011 at 20:11

mitta's user avatar

mittamitta

111 bronze badge

1

Here is something which may work ,

public static int secondLargest(int[] a){
    int max=0;
    int secondMax=0;

    for(int i=0;i<a.length;i++){
        if(a[i]<max){
            if(a[i]>secondMax){
                secondMax=a[i];
            }
            continue;
        }

        if(a[i]>max){
            secondMax=max;
            max=a[i];
        }

    }
    return secondMax;
}

Kevin's user avatar

Kevin

53.3k15 gold badges99 silver badges130 bronze badges

answered Nov 26, 2011 at 18:03

nikhil's user avatar

The upper bound should have be n+log2⁡n−2, but it bigger than O(n) in case of random selection algorithm, but in worst case it much smaller. The solution might be

  1. build a tree like to find the MAX element with n – 1 comparisons

    max(N)
    /
    max(N/2) max(N/2)

  2. remove the MAX and find the MAX again log2n – 1 comparison

PS. It uses additional memory, but it faster than random selection algorithm in worst case.

answered Apr 5, 2012 at 11:47

vasste's user avatar

Can’t we just sort this in decreasing order and take the 2nd element from the sorted array?

answered Oct 5, 2012 at 0:16

jhon's user avatar

jhonjhon

872 silver badges10 bronze badges

How about the following below.
make_heap is O(n) so this is efficient and this is 1-pass
We find the second max by taking advantage that it must be one of the heap children of the parent, which had the maximum.

#include <algorithm>
#include <iostream>

int main()
{
    int arr[6]={0,1,2,3,4,5};

    std::make_heap(arr, arr+6);
    std::cout << "First Max: " << arr[0] << 'n';
    std::cout << "Second Max: " << std::max(arr[1], arr[2]) << 'n';
    return 0;
}

answered Jan 7, 2013 at 17:39

SJHowe's user avatar

SJHoweSJHowe

7565 silver badges11 bronze badges

int max,secondMax;
max=secondMax=array[0];
                                                for(int i=0;i<array.length;i++)
    {                                                   if(array[i]>max)                                                    {                                           max=array[i];                                                   }
                                                        if(array[i]>secondMax && array[i]<max)                                                  {
    secondMax=array[i];                                                 }
    }

answered Apr 22, 2013 at 9:48

Fakhar uz zaman's user avatar

#include <iostream>
using namespace std;

int main() {

   int  max = 0;
    int sec_Max = 0;

    int array[] = {81,70,6,78,54,77,7,78};

    int loopcount = sizeof(array)/sizeof(int);

    for(int i = 0 ; i < loopcount ; ++i)
    {

        if(array[i]>max)
        {
            sec_Max = max;
            max = array[i];
        }

        if(array[i] > sec_Max && array[i] < max)
        {
            sec_Max = array[i];
        }
    }

    cout<<"Max:" << max << " Second Max: "<<sec_Max<<endl;

    return 0;
}

coyotte508's user avatar

coyotte508

9,0256 gold badges43 silver badges63 bronze badges

answered Jun 5, 2016 at 11:18

Bunny's user avatar

BunnyBunny

11 bronze badge

1

// Set the first two different numbers as the maximum and second maximum numbers

 int max = array[0];
 int i = 1;
//n is the amount of numbers

 while (array[i] == max && i < n) i++;
 int sec_max = array[i];
 if( max < sec_max ) {
    tmp = sec_max;
    sec_max = max;
    max = tmp;
 }

//find the second maximum number

 for( ; i < n; ++i ) {
   if( array[i] > max ) {
     sec_max = max;
     max = array[i];
   } else if( array[i] > sec_max && array[i] != max ) {
     sec_max = array[i];
   }
 }
 printf("The second maximum number is %dn", sec_max);

Flexo's user avatar

Flexo

86.9k22 gold badges190 silver badges272 bronze badges

answered Sep 24, 2011 at 12:13

tianya's user avatar

tianyatianya

931 silver badge4 bronze badges

1

Помогите. Задача описана в первых комментариях кода.
Никак не могу понять, как найти два максимальных элемента массива и их индекс.
Например, массив у нас пусть будет {10, -2, 3, 9, 7, 6, 2, -10, 9, 10}
Нужно чтобы показало элементы A[0] = 10 и A[9] = 10.

И ещё, поясните почему рандом постоянно генерирует одни и те же значения при компиляции.

// Задача: заполнить массив из 10 элементов случайными числами 
// в интервале [-10..10] и найти в нем 
// два максимальных элемента и их номера. 
#include <iostream>
#include <cstdlib>
using namespace std; 

// Функция, возвращает случайное число в заданном диапазоне [a,b].
int random (int min, int max)
{
    max++;
    return abs(rand()%(max-min))+min;
}


int main()
{
    const int N = 10;
    int A[N], i, element, first_max_element, second_max_element, random_number_is, iMAX1, iMAX2;
    
    cout<<"Enter 5 elements of array.nn";
    
    // Заполняем массив рандомными числами.
    for(i =0; i<N; i++)
    {
        random_number_is = random(-10,10);
        A[i] = {random_number_is};
        cout<<"Random A["<<i<<"]: "<< random_number_is<<"n";       
    }
    
    // Вычисляем первый максимальный элемент массива.
    first_max_element = A[0];
    iMAX1 = 0;
    for(i=0; i<N; i++)
    {
        if(A[i] > first_max_element)
        {
            first_max_element = A[i];
            iMAX1 = i;      
        }   
    }

    // Вычисляем второй максимальный элемент массива.
    second_max_element = A[0];
    iMAX2 = 0;
    for(i=0; i<N; i++)
    {
        if(A[i] > second_max_element && iMAX1 != iMAX2)
        {
            second_max_element = A[i];
            iMAX2 = i;      
        }
    }
    
    cout<<"nFirst max element of array is: "<<"A["<<iMAX1<<"]: "<<first_max_element;
    cout<<"nSecond max element of array is: "<<"A["<<iMAX2<<"]: "<<second_max_element;
}

ver6959

0 / 0 / 0

Регистрация: 14.07.2015

Сообщений: 4

1

Найти второй максимальный элемент в массиве

23.04.2017, 17:58. Показов 13320. Ответов 9

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте!

Подскажите, пожалуйста, как найти второй максимальный элемент в массиве?

Спасибо.

Моя попытка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int max=0, P, M;
 
        for (int i = 0; i < N; i++) {
          if (arr[i]>max) {
            max = arr[i];
            P=i;
          }
        }
 
        for (int i = 0; i < N; i++) {
          if (arr[i]>max) {
            if (i!=P) {
             max = arr[i];
             M=i;
            }
          }
        }



0



FreeYourMind

147 / 147 / 104

Регистрация: 13.11.2016

Сообщений: 557

23.04.2017, 20:37

2

Лучший ответ Сообщение было отмечено ver6959 как решение

Решение

Цитата
Сообщение от ver6959
Посмотреть сообщение

второй максимальный элемент

то есть в массиве есть второй элемент равный максимальному? или тот, что максимально близкий к мексимальному?

Добавлено через 37 минут
ver6959,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    const int n=8;
    int max = INT_MIN, p, v, arr[n];
    cout << "Fill in the array:" << endl;
    for (int i=0; i<n; i++)
    {
        cin >> arr[i];
        if (arr[i] > max)
        {
            max = arr[i];
            p = i;
        }
        if (arr[i]==max)
        {
            if (i!=p)
                v=i;
        }
    }
    system ("cls");
    cout << "Your array is" << endl;
    for (int i=0; i<n; i++)
    {
        cout << arr[i] << 't';
    }
    cout << endl;
    cout << p+1 <<endl;
    cout << v+1 << endl;
    system("pause");
    return 0;
}



1



повар1

783 / 590 / 317

Регистрация: 24.02.2017

Сообщений: 2,087

23.04.2017, 21:36

3

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream.h>
 
int main()
{
  int max=0, mas[10]={5,1,8,11,2,10,11,3,9,10};
 
  for(int i=0;i<10;i++)
    if(max<mas[i])
     max=mas[i];
 
   for(int i=0;i<10;i++)
     if(max==mas[i])
     cout<<max<<" pri i = "<<i<<"n";
 
system("pause>NUL");
    return 0;
}



0



0 / 0 / 0

Регистрация: 14.07.2015

Сообщений: 4

23.04.2017, 21:44

 [ТС]

4

Второй элемент, который равен максимальному.

Добавлено через 2 минуты
А если в массиве будет 3 максимальных элемента, но запомнить индекс нужно именно второго? По Вашей программе ведь запомнится индекс последнего максимального элемента, разве нет?



0



повар1

783 / 590 / 317

Регистрация: 24.02.2017

Сообщений: 2,087

23.04.2017, 21:54

5

Добавь счетчик количества выводов элементов массива

C++
1
 if(max==mas[i] && t<2)



1



0 / 0 / 0

Регистрация: 14.07.2015

Сообщений: 4

23.04.2017, 21:56

 [ТС]

6

второй элемент равный максимальному



0



повар1

783 / 590 / 317

Регистрация: 24.02.2017

Сообщений: 2,087

23.04.2017, 21:57

7

C++
1
2
3
4
5
6
7
8
9
10
11
12
 int max=0, t=0, mas[10]={5,1,8,11,11,10,11,3,9,10};
 
  for(int i=0;i<10;i++)
    if(max<mas[i])
     max=mas[i];
 
   for(int i=0;i<10;i++)
     if(max==mas[i] && t<2)
     {
     cout<<max<<" pri i = "<<i<<"n";
      t++;
      }



0



yxelan

4 / 4 / 6

Регистрация: 08.01.2012

Сообщений: 27

23.04.2017, 22:45

8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<iostream>
#include<clocale>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "russian");
 
    const int n = 5;
    int arr[n] = { 2,1,5,6,3 };
    int x = 0, y = 0;
 
//первое решение------------------------------------------------------------------------
    for (int i = 0; i < n; i++)
    {
        for (int j = i ; j < n; j++)
        {
            if (arr[i] < arr[j] && arr[i] > arr[x])
            {
                x = j;
                i = j;
            }
            else if (arr[i] > arr[j] && arr[i] > arr[x])
            {
                x = i;
            }
        }
    }
    cout << "В массиве под номером " << x+1 << 
        " находится максимальный элемент массива со значением равным " << arr[x] << endl;
 
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            if (arr[i] < arr[j] && arr[i] > arr[y] && j != x)
            {
                y = j;
                i = j;
            }
            else if (arr[i] > arr[j] && arr[i] > arr[y] && i != x)
            {
                y = i;
            }
        }
    }
    cout << "В массиве под номером " << y + 1 <<
        " находится второй максимальный элемент массива со значением равным " << arr[y] << endl << endl;
 
 
//второе решение--------------------------------------------------------------------------------
    int max = arr[0], max2 = arr[0];
    int p, m;
    for (int i = 0; i < n; i++)
    {
        if (arr[i] > max)
        {
            p = i;
            max = arr[i];
        }
    }
    cout <<"Номер элемента в массиве "<< p+1 << 
        ", максимальное значение равно: " << max << endl;
    for (int i = 0; i < n; i++)
    {
        if (arr[i] > max2 && arr[i] != max)
        {
            m = i;
            max2 = arr[i];
        }
    }
    cout << "Номер элемента в массиве " << m + 1 << 
        ", второе максимальное значение равно: " << max2 << endl << endl;
 
    system("pause");
    return 0;
}



0



Dani

1404 / 646 / 135

Регистрация: 11.08.2011

Сообщений: 2,299

Записей в блоге: 2

23.04.2017, 23:05

9

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main()
{
    int arr[] = { 1, 5, 4, 2, 3, 5, 4, 3, 2, 4, 6, 8, 98, 7, 5, 4, 2, 4 };
    std::nth_element(std::begin(arr), std::end(arr) - 2, std::end(arr));
    std::cout << *(std::end(arr) - 2) << std::endl;
    return 0;
}



0



147 / 147 / 104

Регистрация: 13.11.2016

Сообщений: 557

24.04.2017, 19:21

10

ver6959, сделайте счетчик.. или сделайте отдельный цикл для вывода массива а для поиска элементов другой и там в ифе (который ищет второй индекс) делайте break;



0



Паскаль. В линейном массиве найти два максимальных элемента.



Профи

(638),
закрыт



11 лет назад

Дополнен 11 лет назад

заполнение массива случайными числами

Дополнен 11 лет назад

нужна программа, я одно максимальное число нашла, а как найти сразу два максимальных элемента???

Руслан Синкевич

Профи

(787)


11 лет назад

Самый простой вариант – сделать второй проход, запомнив индекс максимального элемента, который был установлен в предыдущем проходе. При втором проходе просто пропустить его, выполнив проверку (к примеру if not i=2 then if a(i) > max then max:=a(i) )

var
max1, ind, max2, i : integer;
a : array [1..100] of integer;
begin
randomize;
for i:=1 to 100 do
a(i) := random(200);
max1 := a(i);
for i:=2 to 100 do
if a(i) > max1 then begin max1 := a(i); ind = i; end;
max2 := a(i);
for i:=2 to 100 do
if (a(i) > max2) and (i <> ind) then max2 := a(i);
writeln(‘max1=’, max1, ‘ max2=’, max2);
end.

Примерно так. Писал по памяти, нет под рукой компилятора. (i) замените на квадратные скобки.

dosmot dosmot

Мастер

(1739)


11 лет назад

После того, как одно максимальное число найдено, ищите второе точно так же, но при этом сравнивайте с первым (его занести в отдельную переменную) . Т. е. оно должно получиться больше всех чисел в массиве, кроме первого числа.

****** ******

Ученик

(199)


6 лет назад

код С#
________
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();
int[] initArr = new int[10000];
for (int i = 0; i < initArr.Length; i++)
{
initArr[i] = rnd.Next(-1000, 1000);
}

var outArr = Sort(initArr, 10);
}

private static int[] Sort(int[] array, int count)
{
int[] outArr = new int[count];
for (int i = 0; i < outArr.Length; i++)
{
int[] sorted = new int[count];
for (int j = 0; j < array.Length; j++)
{
if (!sorted.Contains(array[j]) && array[j] == array.Max())
{
outArr[i] = array[j];
array[j] = 0;
}
}
}

return (int[]) outArr.Reverse();
}
}
}

Выбирает из массива А массив максимальных чисел Б. В массиве А числа могут повторяться и поэтмоу также считаются максимальными. Требует доработки, т. к. 5 элементов из 10000 массива выберет за 6 сек. А если надо будет выбрать 1000?? Прикрути linq и возможно будет тебе праздник, но не факт, скорее всего еще медленее станет работать

Дан целочисленный массив… Второй максимум…

Задание:

Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.

Паскаль

const N=30; 
var a: array [1..N] of integer; 
    i, k, max, max2: integer; 
begin
  for i:=1 to N do readln(a[i]); 
  …
end.

Си

#include<stdio.h> 
int main(void) { 
  const int N=30; 
  int a[N]; 
  int i, k, max, max2; 
  for (i=0; i<N; i++)
    scanf(″%d″, &a[i]); 
  …
}

Естественный язык

Объявляем массив A из 30 элементов. Объяв-ляем целочисленные переменные i, k, max, max2. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. 

Решение:

Сложность в том, что нужно найти не  максимальный элемент, а второй по величине. Можно, конечно, сначала найти максимум, а потом искать следующий за ним, но можно сделать это за один проход по массиву. Нам нужны две переменные, max (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max, а второй по величине записываем в max2:


if a[1] > a[2] then begin
  max:=a[1]; max2:=a[2]; 
end
else begin
  max:=a[2]; max2:=a[1]; 
end;
 

Затем в цикле перебираем все элементы, начиная с 3-го (первые два уже «задействованы»!) до последнего, 30-ого. Если очередной элемент a[i] больше, чем max, записываем значение max в max2 (предыдущий максимум становится вторым), а значение a[i] – в max. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2. Вот решение на Паскале

const N=30;
var a: array [1..N] of integer;
i, k, max, max2: integer;
begin
  for i:=1 to N do readln(a[i]);
  if a[1] > a[2] then begin
    max:=a[1]; max2:=a[2] 
  end
  else begin
    max:=a[2]; max2:=a[1] 
  end;
  for i:=3 to N do
    if a[i] > max then begin
      max2 := max;
      max := a[i]
    end
    else if a[i] > max2 then max2 := a[i];
  writeln(max2)
end.

Добавить комментарий