Vasilică are la grădiniţă N turnuri cu înălţimile h1, h2, …, hN. Când aşază în linie nişte turnuri, cel puţin două, astfel încât înălţimile lor să fie în ordine crescătoare, Vasilică spune că a construit un deal. Înălţimea dealului este egală cu înălţimea celui mai înalt turn folosit. Iată, de exemplu, că aşezând în ordine turnurile cu înălţimile 2 4 4 7 9 a format un deal cu înălţimea 9.
Vasilică şi-ar dori să aşeze în linie cele N turnuri, formând o succesiune de dealuri astfel încât suma înălţimilor dealurilor formate să fie maximă.
Cerinţă
Scrieţi un program care, cunoscând înălţimile celor N turnuri, va determina suma înălţimilor dealurilor ce se pot forma aşezând în linie cele N turnuri, maximă posibil.
Date de intrare
Fișierul de intrare deal.in conține pe prima linie numărul natural N. Pe cea de a doua linie se află N numere naturale separate prin spaţii, reprezentând înălţimile celor N turnuri.
Date de ieșire
Fișierul de ieșire deal.out va conține o singură linie pe care va fi scris un număr natural reprezentând cerinţa problemei.
Restricții și precizări
2 ≤ N ≤ 100 0001 ≤Înălţimile turnurilor≤ 100 000- Dacă după aranjarea turnurilor
hi≤ hi+1atunci turnurileişii+1fac parte din acelaşi deal.
Exemplu
deal.in
7 10 2 2 2 7 5 2
deal.out
22
Explicație
O soluţie posibilă cu suma înălţimilor 22 ar fi: 2 10 2 5 2 2 7
S-au format trei dealuri: 2 10 (cu înălţimea 10) şi 2 5 (cu înălţimea 5) şi 2 2 7 cu înălțimea 7.
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 Deal:
// sursa de 100 puncte Ciprian Chesca
#include <fstream>
#define nmax 100001
using namespace std;
int main()
{
ifstream f("deal.in");
ofstream g("deal.out");
long n,w[nmax],v[nmax],i,x,st,dr,pdp;
long long s=0;
f>>n;
for(i=1;i<nmax;i++)
w[i]=0;
for(i=1;i<=n;i++)
{f>>x;w[x]++;}
for(i=1;i<=n;i++)
v[i]=w[i];
st=1;dr=nmax-1;
while (w[st]==0) st++;
while (w[dr]==0) dr--;
while (st!=dr)
{
if (w[st]==0) st++;
else
if (w[dr]==0) dr--;
else {s=s+dr;w[st]--;w[dr]--;}
}
pdp=(n-w[dr])/2+1-(v[dr]-w[dr]);
if (w[dr]/2<=pdp) s=s+dr*(w[dr]/2);
else s=s+dr*pdp;
g<<s;
f.close();
g.close();
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
.
Rezolvarea problemei #1070 Deal
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1070 Deal 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!