пʼятниця, 27 лютого 2015 р.

NewCircle

(Джерело: 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.

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;
}

* Розв'язання, на мою думку вірне, але проходить 9 з 10 тестів.

Немає коментарів:

Дописати коментар