diff options
Diffstat (limited to '2020/1a.cpp')
-rw-r--r-- | 2020/1a.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/2020/1a.cpp b/2020/1a.cpp new file mode 100644 index 0000000..179598b --- /dev/null +++ b/2020/1a.cpp @@ -0,0 +1,90 @@ +#include <iostream> +#include <fstream> +#include <string> +#include <vector> +#include <bitset> +#include <functional> +#include <cstdlib> +#include <climits> +#include <ctime> +#include <cassert> + + +static double time_func(std::function<void()> func) { + const double minmeasure = 2.0; + const double factor = 1.5; + + for (int reps = 1; + reps < INT_MAX / factor; + reps = std::max<int>(reps + 1, reps * factor)) { + const clock_t t_start = clock(); + for (int k = 0; k < reps; k++) func(); + const clock_t t_end = clock(); + const double time_taken = (double)(t_end - t_start) / CLOCKS_PER_SEC; + std::cerr << reps << "x -> " << time_taken << "s" << std::endl; + if (time_taken >= minmeasure) return time_taken / reps; + } + + assert(false); +} + +static std::string read_input() { + std::ios::sync_with_stdio(false); + + std::ifstream file{"1.in"}; + file.seekg(0, std::ios::end); + size_t filesize = file.tellg(); + file.seekg(0); + + std::string input(filesize, '\0'); + size_t cursor = 0; + while (cursor < filesize) { + file.read(&input[cursor], filesize - cursor); + cursor += file.gcount(); + } + + return input; +} + +static std::pair<int, int> solve(const std::string &input) { + std::vector<int> numbers; + numbers.reserve(input.size() / 2); + + std::bitset<2021> have; + + char *endp = nullptr; + const char *cursor = input.data(); + while (true) { + int val = strtol(cursor, &endp, 10); + if (endp == cursor) break; + numbers.push_back(val); + have[val] = true; + cursor = endp; + } + + int ans1 = -1; + for (int n : numbers) { + if (2020 - n >= 0 && have[2020 - n]) { + ans1 = n * (2020 - n); + break; + } + } + + for (int n : numbers) { + for (int m : numbers) { + const int k = 2020 - (n + m); + if (k >= 0 && have[k]) { + return std::make_pair(ans1, n * m * k); + } + } + } + + assert(false); +} + +int main() { + const std::string input = read_input(); + auto out = solve(input); + std::cout << out.first << '\n' << out.second << std::endl; + std::cout << time_func([&input](){ solve(input); }) << std::endl; +} |