CSES - Datatähti 2025 alku - Results
Submission details
Task:Tikut
Sender:Tmotomaster
Submission time:2024-11-10 11:31:57 +0200
Language:C++ (C++20)
Status:COMPILE ERROR

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:141:14: error: 'ceil' was not declared in this scope
  141 |       while (ceil((float)suurin / (float)leikkaus) > toiseksiSuurin && leikkaus - 1 < k - l) {
      |              ^~~~

Code

#include <iostream>
using namespace std;

struct Pituus {
  int arvo;
  bool olemassa = true;
  Pituus* vasen = nullptr;
  Pituus* oikea = nullptr;

  Pituus(int luku) {
    arvo = luku;
  }

  ~Pituus() {
    if (vasen != nullptr) {
      delete vasen;
    }
    if (oikea != nullptr) {
      delete oikea;
    }
  }

  void Add(int luku) {
    if (luku < arvo) {
      if (vasen == nullptr) {
        vasen = new Pituus(luku);
      } else {
        vasen->Add(luku);
      }
    } else {
      if (oikea == nullptr) {
        oikea = new Pituus(luku);
      } else {
        oikea->Add(luku);
      }
    }
  }

  Pituus* Get(int luku) {
    if (luku == arvo) {
      return this;
    } else if (luku < arvo) {
      if (vasen == nullptr) {
        return this;
      } else {
        return vasen->Get(luku);
      }
    } else {
      if (oikea == nullptr) {
        return this;
      } else {
        return oikea->Get(luku);
      }
    }
  }

  int Suurin(int varaArvo=0) {
    if (oikea == nullptr) {
      if (olemassa) {
        return arvo;
      } else if (vasen != nullptr) {
        return vasen->Suurin(varaArvo);
      } else {
        return varaArvo;
      }
    } else {
      return oikea->Suurin(olemassa ? arvo : varaArvo);
    }
  }

  int ToiseksiSuurin(int varaArvo = 0) {
    int suurin = Suurin();
    if (oikea == nullptr) {
      return (*vasen).arvo;
    } else if ((*oikea).arvo == suurin) {
      if (olemassa) {
        return arvo;
      } else if (vasen != nullptr) {
        return vasen->ToiseksiSuurin(varaArvo);
      } else {
        return varaArvo;
      }
    } else {
      return oikea->ToiseksiSuurin(olemassa ? arvo : varaArvo);
    }
  }

  int Pienin(int varaArvo=0) {
    if (vasen == nullptr) {
      return olemassa ? arvo : varaArvo;
    } else {
      return vasen->Pienin(olemassa ? arvo : varaArvo);
    }
  }

  void mPrint() {
    if (vasen != nullptr) {
      vasen->mPrint();
    }
    if (olemassa) {
      cout << '|' << arvo << '|';
    }
    if (oikea != nullptr) {
      oikea->mPrint();
    }
  }

  void Leikkaa(int luku, int nimittaja) {
    (*this->Get(luku)).olemassa = false;
    int pikkuosia = nimittaja * ((luku / nimittaja) + 1) - luku;
    for (int i = 0; i < pikkuosia; i++) {
      Add(luku / nimittaja);
    }
    for (int i = 0; i < nimittaja - pikkuosia; i++) {
      Add(luku / nimittaja + 1);
    }
  }
};

int main() {
  int n, m;
  cin >> n >> m;
  int tikku1;
  cin >> tikku1;
  int* alkutikut = new int[n] {tikku1};
  for (int i = 1; i < n; i++) {
    int tikku;
    cin >> tikku;
    alkutikut[i] = tikku;
  }
  
  for (int k = 1; k <= m; k++) {
    Pituus* tikut = new Pituus(tikku1);
    for (int i = 1; i < n; i++) {
      tikut->Add(alkutikut[i]);
    }
    for (int l = 0; l < k; l++) {
      int suurin = tikut->Suurin();
      int toiseksiSuurin = tikut->ToiseksiSuurin();
      int leikkaus = 2;
      while (ceil((float)suurin / (float)leikkaus) > toiseksiSuurin && leikkaus - 1 < k - l) {
        leikkaus += 1;
        l++;
      }
      tikut->Leikkaa(suurin, leikkaus); // Tee pituudesta jotenkin sellainen, ettei se jaa ainoastaan kahdella. Sä pystyt siihen ehkä :ɔ
    }
    // tikut->mPrint();
    cout << tikut->Suurin() - tikut->Pienin();
    if (k < m) {
      cout << " ";
    }
  }
  return 0;
}