#include <iostream> #include <stdio.h> #include <queue> #include <algorithm> #include <vector> using namespace std; int main() { int n; scanf("%d", &n); int tmp; priority_queue< pair<int, pair<int, int> >, vector< pair<int, pair<int, int> > >, std::greater< pair<int, pair<int, int> > > > pq; for (int i = 0; i < n; i++) { for (int j = 0; j < n - i; j++) { scanf("%d", &tmp); pq.push(make_pair(tmp, make_pair(i, j))); } } vector< pair<int, int> > znalezione; int i = 0; long long int wynik = 0; while (!pq.empty() && i < n) { pair<int, pair<int, int> > el = pq.top(); pq.pop(); int znalezioneCount = znalezione.size(); if (find(znalezione.begin(), znalezione.end(), make_pair(el.second.first, el.second.first + el.second.second)) == znalezione.end()) { i++; wynik += (long long int) el.first; znalezione.push_back(make_pair(el.second.first, el.second.first + el.second.second)); for (int i = 0; i < znalezioneCount; i++) { if (znalezione[znalezioneCount].second == znalezione[i].second && znalezione[znalezioneCount].first < znalezione[i].first) { znalezione.push_back(make_pair(znalezione[znalezioneCount].first, znalezione[i].first - 1)); } if (znalezione[znalezioneCount].first == znalezione[i].first && znalezione[znalezioneCount].second > znalezione[i].second) { znalezione.push_back(make_pair(znalezione[i].second + 1, znalezione[znalezioneCount].second)); } if (znalezione[i].second == znalezione[znalezioneCount].second && znalezione[i].first < znalezione[znalezioneCount].first) { znalezione.push_back(make_pair(znalezione[i].first, znalezione[znalezioneCount].first - 1)); } if (znalezione[i].first == znalezione[znalezioneCount].first && znalezione[i].second > znalezione[znalezioneCount].second) { znalezione.push_back(make_pair(znalezione[znalezioneCount].second + 1, znalezione[i].second)); } if (znalezione[i].second == znalezione[znalezioneCount].first - 1) { znalezione.push_back(make_pair(znalezione[i].first, znalezione[znalezioneCount].second)); } if (znalezione[znalezioneCount].second == znalezione[i].first - 1) { znalezione.push_back(make_pair(znalezione[znalezioneCount].first, znalezione[i].second)); } } } } printf("%lld\n", wynik); 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 | #include <iostream> #include <stdio.h> #include <queue> #include <algorithm> #include <vector> using namespace std; int main() { int n; scanf("%d", &n); int tmp; priority_queue< pair<int, pair<int, int> >, vector< pair<int, pair<int, int> > >, std::greater< pair<int, pair<int, int> > > > pq; for (int i = 0; i < n; i++) { for (int j = 0; j < n - i; j++) { scanf("%d", &tmp); pq.push(make_pair(tmp, make_pair(i, j))); } } vector< pair<int, int> > znalezione; int i = 0; long long int wynik = 0; while (!pq.empty() && i < n) { pair<int, pair<int, int> > el = pq.top(); pq.pop(); int znalezioneCount = znalezione.size(); if (find(znalezione.begin(), znalezione.end(), make_pair(el.second.first, el.second.first + el.second.second)) == znalezione.end()) { i++; wynik += (long long int) el.first; znalezione.push_back(make_pair(el.second.first, el.second.first + el.second.second)); for (int i = 0; i < znalezioneCount; i++) { if (znalezione[znalezioneCount].second == znalezione[i].second && znalezione[znalezioneCount].first < znalezione[i].first) { znalezione.push_back(make_pair(znalezione[znalezioneCount].first, znalezione[i].first - 1)); } if (znalezione[znalezioneCount].first == znalezione[i].first && znalezione[znalezioneCount].second > znalezione[i].second) { znalezione.push_back(make_pair(znalezione[i].second + 1, znalezione[znalezioneCount].second)); } if (znalezione[i].second == znalezione[znalezioneCount].second && znalezione[i].first < znalezione[znalezioneCount].first) { znalezione.push_back(make_pair(znalezione[i].first, znalezione[znalezioneCount].first - 1)); } if (znalezione[i].first == znalezione[znalezioneCount].first && znalezione[i].second > znalezione[znalezioneCount].second) { znalezione.push_back(make_pair(znalezione[znalezioneCount].second + 1, znalezione[i].second)); } if (znalezione[i].second == znalezione[znalezioneCount].first - 1) { znalezione.push_back(make_pair(znalezione[i].first, znalezione[znalezioneCount].second)); } if (znalezione[znalezioneCount].second == znalezione[i].first - 1) { znalezione.push_back(make_pair(znalezione[znalezioneCount].first, znalezione[i].second)); } } } } printf("%lld\n", wynik); return 0; } |