Rezolvare completă PbInfo #1096 Expresie8

Costel are de rezolvat o temă grea la matematică: având la dispoziţie N numere naturale nenule trebuie să aşeze între acestea 2 operaţii de înmulţire şi N-3 operaţii de adunare, astfel încât rezultatul calculelor să fie cel mai mare posibil. Nu este permisă modificarea ordinii numerelor date.

De exemplu, dacă N=5 şi numerele sunt 4, 7, 1, 5, 3, operaţiile pot fi aşezate 4+7*1+5*3, 4*7*1+5+3, e.t.c

Cerinţă

Scrieţi un program care să aşeze două operaţii de înmulţire şi N-3 operaţii de adunare între cele N valori date astfel încât valoarea expresiei obţinute să fie maximă.

Date de intrare

Fișierul de intrare expresie8.in are următoarea structură:

  • Pe prima linie se află un număr natural N, reprezentând numărul elementelor date.
  • Pe următoarele linii se află cele N numere naturale date, fiecare pe câte o linie.

Date de ieșire

Fișierul de ieșire expresie8.out va conține pe prima linie valoarea maximă obţinută prin evaluarea expresiei.

Restricții și precizări

  • 4 <= N <= 1000
  • Numerele date sunt numere naturale între 1 şi 10000

Exemplu

expresie8.in

5
4
7
1
5
3

expresie8.out

44

Explicație

Valoarea maximă se obţine prin aşezarea operaţiilor sub forma: 4 * 7 + 1 + 5*3.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Expresie8:

#include <iostream>
#include <fstream>
using namespace std;
 
ifstream fin("expresie8.in");
ofstream fout("expresie8.out");
int n,v[1001];
 
int main(){
    fin>>n;
    long long int s = 0, Max=0;
    for(int i=1;i<=n;++i)
        fin>>v[i], s+=v[i];
     
    for(int i=1;i<=n-2;++i){
        long long int cc = s-v[i]-v[i+1]-v[i+2]+(long long)v[i]*v[i+1]*v[i+2];
        if(cc>Max)
            Max = cc;
    }
    for(int i=1;i<=n-3;++i)
        for(int j=i+2;j<=n-1;++j){
            long long int cc = s-v[i]-v[i+1]-v[j]-v[j+1]+v[i]*v[i+1]+v[j]*v[j+1];
            if(cc>Max)
                Max = cc;
        }
    fout<<Max<<endl;
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1096 Expresie8

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1096 Expresie8 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!