Gustavo, după ce a realizat că posedă abilitatea de a vedea în viitor, a decis că a venit momentul să treacă la următorul nivel și să-și valorifice capacitățile extrasenzoriale. Pentru a câștiga prestigiu și a deveni mai cunoscut în rândurile magicienilor profesioniști, acesta a ales să debuteze la Olimpiada Națională de Informatică prin prezicerea datelor de intrare pentru anumite probleme propuse în concurs. Primul client al lui Gustavo, Alfredo, ar dori să afle într-un mod inedit conținutul unui fișier de intrare aferent unei probleme de concurs, în care sunt scrise elementele unui șir p
de N
numere întregi. Pentru a face lucrurile mai interesante, Gustavo îi percepe o taxă de C(i,j)
bănuți pentru a-i divulga suma numerelor din șirul p
cu indici în intervalul [i, j]
, anume p
i
+ p
i+1
+ ... + p
j
.
Cerința
Dându-se valoarea lui N
și toate valorile C(i,j)
cu 1 ≤ i ≤ j ≤ N
, determinați costul total minim pe care trebuie să-l plătească Alfredo pentru a afla toate elementele șirului p
.
Date de intrare
În fișierul oracol.in
se află pe prima linie numărul natural N
. Pe următoarele N
linii se află taxele percepute de Gustavo astfel: pe linia i+1
se vor afla N-i+1
numere naturale separate prin câte un spațiu, reprezentând în ordine costurile C(i,i)
, C(i,i+1)
, …, C(i,N)
.
Date de ieșire
Fișierul de ieșire oracol.out
va conține pe prima linie un singur număr care reprezintă costul total minim pe care trebuie să-l plătească Alfredo pentru a afla șirul p
.
Restricții și precizări
1 ≤ N ≤ 1000
;- pentru orice
1 ≤ i ≤ j ≤ N
se garantează0 ≤ C(i,j) ≤ 1.000.000
; - pentru teste în valoare de
48
puncte1 ≤ N ≤ 250
.
Exemplu
oracol.in
3 4 5 1 6 3 2
oracol.out
6
Explicație
Costul total minim este 6
și se obține astfel:
Cu un cost de valoare C(1,3) = 1
putem afla suma p
1
+ p
2
+ p
3
.
Cu un cost de valoare C(3,3) = 2
putem afla valoarea lui p
3
.
Cu un cost de valoare C(2,3) = 3
putem afla suma p
2
+ p
3
.
Din acestea putem afla exact toate elementele șirului p
.
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 oracol:
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
struct Edge {
int from, to, cost;
bool operator<(const Edge& e) const {
return cost < e.cost;
}
};
class DSU {
public:
DSU(int n):
f(n) {
for (int i = 0; i < n; ++i) {
f[i] = i;
}
}
int& operator[](int x) {
int y, p;
for (y = x; y != f[y]; y = f[y]);
for (; x != y; x = p) {
p = f[x];
f[x] = y;
}
return f[y];
}
private:
vector<int> f;
};
int main() {
ifstream fin("oracol.in");
ofstream fout("oracol.out");
int n;
fin >> n;
vector<Edge> edges;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j <= n; ++j) {
int cost;
fin >> cost;
edges.push_back(Edge{i, j, cost});
}
}
sort(edges.begin(), edges.end());
DSU f(n + 1);
int64_t ans = 0;
for (const Edge& e: edges) {
if (f[e.from] != f[e.to]) {
ans += e.cost;
f[e.from] = f[e.to];
}
}
fout << ans << '\n';
}
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 #3061 oracol
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3061 oracol 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!