• + 0 comments

    Here's my solution:

    using namespace std;
    
    string ltrim(const string &);
    string rtrim(const string &);
    vector<string> split(const string &);
    
    /*
     * Complete the 'lowestTriangle' function below.
     *
     * The function is expected to return an INTEGER.
     * The function accepts following parameters:
     *  1. INTEGER trianglebase
     *  2. INTEGER area
     */
    
    int lowestTriangle(int trianglebase, int area) {
        // Area of a triangle with base: a = (h_b*b)/2
        // find the smallest interger `h` such that there exist a triangle `h` base `b` having an area of at least `a`
        // so (h_b*b)/2 >= a 
        // ==> h_b*b >= 2a
        // ==> h_b >= 2a/b
        // ==> h_b = ceil(2a/b)
        // ceil (x/y) = (x+y-1)/y (https://codeforces.com/blog/entry/78852)
        // ==> h_b = (2a + b -1)/b
        return (2*area+trianglebase-1)/trianglebase;
    }
    
    int main()
    {
        ofstream fout(getenv("OUTPUT_PATH"));
    
        string first_multiple_input_temp;
        getline(cin, first_multiple_input_temp);
    
        vector<string> first_multiple_input = split(rtrim(first_multiple_input_temp));
    
        int trianglebase = stoi(first_multiple_input[0]);
    
        int area = stoi(first_multiple_input[1]);
    
        int height = lowestTriangle(trianglebase, area);
    
        fout << height << "\n";
    
        fout.close();
    
        return 0;
    }
    
    string ltrim(const string &str) {
        string s(str);
    
        s.erase(
            s.begin(),
            find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace)))
        );
    
        return s;
    }
    
    string rtrim(const string &str) {
        string s(str);
    
        s.erase(
            find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(),
            s.end()
        );
    
        return s;
    }
    
    vector<string> split(const string &str) {
        vector<string> tokens;
    
        string::size_type start = 0;
        string::size_type end = 0;
    
        while ((end = str.find(" ", start)) != string::npos) {
            tokens.push_back(str.substr(start, end - start));
    
            start = end + 1;
        }
    
        tokens.push_back(str.substr(start));
    
        return tokens;
    }