aboutsummaryrefslogtreecommitdiff
path: root/week02
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-03-20 12:30:52 +0200
committerSyndamia <kamen@syndamia.com>2024-03-20 12:30:52 +0200
commit6b7a20b652bd3388ceaac60c96479419ac2c4859 (patch)
tree84d920137bcd967b4ea886dfa64a1c2d16ee411a /week02
parentc3560a20048e982cff795de0085ab3a76cdd591a (diff)
downloadoop-2023-solutions-6b7a20b652bd3388ceaac60c96479419ac2c4859.tar
oop-2023-solutions-6b7a20b652bd3388ceaac60c96479419ac2c4859.tar.gz
oop-2023-solutions-6b7a20b652bd3388ceaac60c96479419ac2c4859.zip
[w2/ex4] Added solution
Diffstat (limited to 'week02')
-rw-r--r--week02/Exercise4.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/week02/Exercise4.cpp b/week02/Exercise4.cpp
new file mode 100644
index 0000000..c2d6d75
--- /dev/null
+++ b/week02/Exercise4.cpp
@@ -0,0 +1,120 @@
+struct Material {
+ int id;
+ int startingType;
+ int endingType;
+};
+
+struct MaterialArray {
+private:
+ Material* elems;
+ int size;
+ int last;
+
+public:
+ MaterialArray(int size) {
+ this->size = size;
+ elems = new Material[size];
+ last = 0;
+ }
+
+ void Append(const Material& m) {
+ if (size == last) return;
+ elems[last++] = m;
+ }
+
+ int GetSize() {
+ return size;
+ }
+
+ Material* GetByID(int id) {
+ for (int i = 0; i < last; i++) {
+ if (elems[i].id == id) {
+ return &elems[i];
+ }
+ }
+ return nullptr;
+ }
+
+ Material* GetByStartingType(int type) {
+ for (int i = 0; i < last; i++) {
+ if (elems[i].startingType == type) {
+ return &elems[i];
+ }
+ }
+ return nullptr;
+ }
+};
+
+struct Machine {
+private:
+ struct MaterialEfficiency {
+ int id;
+ float percentage;
+ };
+ MaterialEfficiency *efficiency;
+ int knownMaterials;
+
+ int availableThroughput;
+
+public:
+ int ConvertMaterial(int materialID, int quantity) {
+ if (availableThroughput == 0) {
+ return 0;
+ }
+
+ int converts = quantity * GetEfficiency(materialID);
+ availableThroughput -= converts;
+ // Губим материал, понеже машината се е счупила по средата на обработка
+ if (availableThroughput < 0) {
+ converts += availableThroughput;
+ availableThroughput = 0;
+ }
+ return converts;
+ }
+
+ int WillConvert(int materialID, int quantity) {
+ if (availableThroughput == 0) {
+ return 0;
+ }
+
+ int converts = quantity * GetEfficiency(materialID);
+ int newThroughput = availableThroughput - converts;
+ if (newThroughput < 0) {
+ converts += newThroughput;
+ }
+ return converts;
+ }
+
+ void FixFor(int quantity) {
+ availableThroughput += quantity;
+ }
+
+ float GetEfficiency(int id) {
+ for (int i = 0; i < knownMaterials; i++) {
+ if (efficiency[i].id == id) {
+ return efficiency[i].percentage;
+ }
+ }
+ return 0;
+ }
+};
+
+MaterialArray& materialPath(MaterialArray& materials, int startid, int endid) {
+ MaterialArray* path = new MaterialArray(materials.GetSize());
+
+ Material* current = materials.GetByID(startid);
+ path->Append(*current);
+ while(current->id != endid) {
+ current = materials.GetByStartingType(current->endingType);
+ path->Append(*current);
+ }
+
+ return *path;
+}
+
+MachineArray& bestMachinePath(MaterialArray& mpath) {
+
+}
+
+int main() {
+}