#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
struct Interval {
int start;
int size;
unsigned long long price;
};
bool operator< (Interval a, Interval b) {
return a.price < b.price;
}
bool insert(vector<int> &matrix, int start, int size) {
while(true) {
if(size == 0) {
return false;
} else if(matrix[start] == 0) {
matrix[start] = size;
return true;
} else {
int prevStart = start;
start = start + min(size, matrix[start]);
size = abs(size - matrix[prevStart]);
}
}
}
int main() {
ios::sync_with_stdio(0);
int N;
cin >> N;
vector<Interval> offers;
for(int i = 0; i < N; i++) {
for(int j = i; j < N; j++) {
Interval interval;
interval.start = i;
interval.size = j-i+1;
cin >> interval.price;
offers.push_back(interval);
}
}
sort(offers.begin(), offers.end());
vector<int> matrix(N);
int matrixRank = 0;
unsigned long long totalCost = 0;
for(int i = 0; 2*i < N*(N+1); i++) {
if(matrixRank == N) break;
if(insert(matrix, offers[i].start, offers[i].size)) {
matrixRank++;
totalCost += offers[i].price;
}
}
cout << totalCost << endl;
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 69 | #include <iostream> #include <algorithm> #include <cmath> #include <vector> using namespace std; struct Interval { int start; int size; unsigned long long price; }; bool operator< (Interval a, Interval b) { return a.price < b.price; } bool insert(vector<int> &matrix, int start, int size) { while(true) { if(size == 0) { return false; } else if(matrix[start] == 0) { matrix[start] = size; return true; } else { int prevStart = start; start = start + min(size, matrix[start]); size = abs(size - matrix[prevStart]); } } } int main() { ios::sync_with_stdio(0); int N; cin >> N; vector<Interval> offers; for(int i = 0; i < N; i++) { for(int j = i; j < N; j++) { Interval interval; interval.start = i; interval.size = j-i+1; cin >> interval.price; offers.push_back(interval); } } sort(offers.begin(), offers.end()); vector<int> matrix(N); int matrixRank = 0; unsigned long long totalCost = 0; for(int i = 0; 2*i < N*(N+1); i++) { if(matrixRank == N) break; if(insert(matrix, offers[i].start, offers[i].size)) { matrixRank++; totalCost += offers[i].price; } } cout << totalCost << endl; return 0; } |
English