Problems
#include <iostream>
using namespace std;
class cubeSum {
public:
int i, j, sum;
cubeSum(int i = 0, int j = 0) {
this->sum = i * i * i + j * j * j;
this->i = i;
this->j = j;
}
int compareTo(const cubeSum &that) {
if (this->sum > that.sum) return 1;
else if (this->sum < that.sum) return -1;
return 0;
}
string toString() {
string res = to_string(sum) + " = " + to_string(i) + "^3" " + " + to_string(j) + "^3";
return res;
}
};
template <typename key>
class MinPQ {
key *arr;
int N;
int i = 0;
bool greeter(key &key1, key &key2) {
return key1.compareTo(key2) > 0;
}
void swim(int k) {
while (k > 1 && greeter(arr[k / 2], arr[k])) {
swap(arr[k], arr[k / 2]);
k = k / 2;
}
}
void sink(int k) {
while (2 * k <= i) {
int j = 2 * k;
if (j < i && greeter(arr[j], arr[j + 1])) j++; // find out which one is smaller 2k or 2k+1
if (!greeter(arr[k], arr[j])) break; // break if the parent's key is smaller than both children's key
swap(arr[k], arr[j]);
k = j; // moving down the heap
}
}
public:
MinPQ(int capacity) : N(capacity + 1) {
arr = new key[capacity + 1]{NULL};
}
bool isEmpty() {
return i == 0;
}
bool isFull() {
return i == N - 1;
}
// At most 1 + lg N compares
void insert(key val) {
arr[++i] = val;
swim(i);
}
// At most 2 lg N compares
key delMin() {
key min = arr[1];
swap(arr[1], arr[i--]);
sink(1);
arr[i + 1] = NULL; // prevent loitering
return min;
}
};
int main() {
int n = 4;
MinPQ<cubeSum> *PQ = new MinPQ<cubeSum>(n);
for (int i = 0; i < n; i++) {
cubeSum cb(i, i);
PQ->insert(cb);
}
while (!PQ->isEmpty()) {
cubeSum s = PQ->delMin();
if (s.j < n) {
cubeSum cb(s.i, s.j + 1);
PQ->insert(cb);
}
cout << s.toString() << endl;
}
}Last updated