(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=106)
Задача. Дано послідовність цілих чисел. Відрізок послідовності утворюють числа, що йдуть в послідовності підряд в порядку зростання. Знайти номери чисел, якими починається і закінчується перший відрізок з максимальною сумою, а також цю суму.
Технічні умови. Програма читає спочатку кількість елементів послідовності, а потім саму цю послідовність. Всі числа в одному рядку, їх розділено пропусками. Гарантовано, що послідовність не порожня, і всі розрахунки можна вести в межах типу longint. Програма виводить в один рядок 3 числа через пропуск - номера першого і останнього елемента шуканого відрізка і суму чисел відрізку.
Введення 3 -2 -1 0
Виведення 3 3 0
Введення 5 1 2 -3 3 0
Виведення 1 2 3
Розв'язання.*
З послідовності (P[N]) будемо послідовно виділяти відрізки починаючи з 1-го елемента та знаходитемо їх суму (Vs), яку будемо порівнювати з максимальною (Ms) та зберігатимемо початок (Mb) і кінець (Me) відрізка з максимальною сумою.
Запишемо алгоритми мовами програмування.
Free Pascal:
Var Mb, Me,
N, I, J : 1..50;
Ms, Vs : Integer;
P : Array [1..50] Of Integer;
Begin
Read (N);
For I := 1 To N Do
Read(P[I]);
Mb := 1;
Me := 1;
Ms := P[1];
For I :=1 To N Do Begin
Vs := P[I];
For J := I+1 To N+1 Do Begin
If Vs > Ms
Then Begin
Mb := I;
Me := J-1;
Ms := Vs;
End;
If (P[J] > P[J-1]) And (J <= N)
Then Vs += P[J]
Else Break;
End;
End;
Write(Mb, ' ', Me, ' ', Ms);
End.
Var Mb, Me,
N, I, J : 1..50;
Ms, Vs : Integer;
P : Array [1..50] Of Integer;
Begin
Read (N);
For I := 1 To N Do
Read(P[I]);
Mb := 1;
Me := 1;
Ms := P[1];
For I :=1 To N Do Begin
Vs := P[I];
For J := I+1 To N+1 Do Begin
If Vs > Ms
Then Begin
Mb := I;
Me := J-1;
Ms := Vs;
End;
If (P[J] > P[J-1]) And (J <= N)
Then Vs += P[J]
Else Break;
End;
End;
Write(Mb, ' ', Me, ' ', Ms);
End.
C++:
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int p[n];
for (int i=0; i<n; i++)
cin >> p[i];
int mb=0, me=0, ms=p[0];
for (int i=0; i<n; i++){
int vs=p[i];
for (int j=i+1; j<n+1; j++){
if (vs>ms){
mb=i;
me=j-1;
ms=vs;
};
if ((p[j]>p[j-1])&&(j<n))
vs+=p[j];
else break;
}
}
cout << mb+1 << ' ' << me+1 << ' ' << ms;
}
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int p[n];
for (int i=0; i<n; i++)
cin >> p[i];
int mb=0, me=0, ms=p[0];
for (int i=0; i<n; i++){
int vs=p[i];
for (int j=i+1; j<n+1; j++){
if (vs>ms){
mb=i;
me=j-1;
ms=vs;
};
if ((p[j]>p[j-1])&&(j<n))
vs+=p[j];
else break;
}
}
cout << mb+1 << ' ' << me+1 << ' ' << ms;
}
* Розв'язання, на мою думку вірне, але проходить 9 з 10 тестів.
Немає коментарів:
Дописати коментар