#include <iostream> #include <algorithm> #include <vector> using namespace std; typedef struct _przedzial { public: unsigned poczatek, koniec, cena; } przedzial; bool myfunction (const przedzial & i,const przedzial & j) { if(i.cena==j.cena){ if(i.poczatek==j.poczatek) return i.koniec>j.koniec; return i.poczatek>j.poczatek; } return i.cena<j.cena; } vector <przedzial> prze_vec; int n; int main () { ios_base::sync_with_stdio (false); cin >> n; for(int i = 0;i<n;++i){ for(int j = i;j<n;++j){ przedzial _p; _p.poczatek = j-i; _p.koniec = j+1; cin >> _p.cena; prze_vec.push_back(_p); } } sort(prze_vec.begin(), prze_vec.end(), myfunction); vector <int> tab(n+1,-1); int z = n; unsigned long long index = 0; unsigned long long calkowity_koszt = 0; while(z>0){ int i = prze_vec[index].poczatek; int j = prze_vec[index].koniec; while(i<n){ if(tab[i]==-1){ tab[i] = j; calkowity_koszt+=prze_vec[index].cena; --z; } else{ if(tab[i]<j){ i = tab[i]; } else{ if(tab[i]>j){ int tmp = j; j = tab[i]; tab[i] = tmp; i = tab[i]; } else break; } } } ++index; } cout << calkowity_koszt; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | #include <iostream> #include <algorithm> #include <vector> using namespace std; typedef struct _przedzial { public: unsigned poczatek, koniec, cena; } przedzial; bool myfunction (const przedzial & i,const przedzial & j) { if(i.cena==j.cena){ if(i.poczatek==j.poczatek) return i.koniec>j.koniec; return i.poczatek>j.poczatek; } return i.cena<j.cena; } vector <przedzial> prze_vec; int n; int main () { ios_base::sync_with_stdio (false); cin >> n; for(int i = 0;i<n;++i){ for(int j = i;j<n;++j){ przedzial _p; _p.poczatek = j-i; _p.koniec = j+1; cin >> _p.cena; prze_vec.push_back(_p); } } sort(prze_vec.begin(), prze_vec.end(), myfunction); vector <int> tab(n+1,-1); int z = n; unsigned long long index = 0; unsigned long long calkowity_koszt = 0; while(z>0){ int i = prze_vec[index].poczatek; int j = prze_vec[index].koniec; while(i<n){ if(tab[i]==-1){ tab[i] = j; calkowity_koszt+=prze_vec[index].cena; --z; } else{ if(tab[i]<j){ i = tab[i]; } else{ if(tab[i]>j){ int tmp = j; j = tab[i]; tab[i] = tmp; i = tab[i]; } else break; } } } ++index; } cout << calkowity_koszt; return 0; } |