diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-05-06 17:51:22 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-05-06 17:51:22 +0800 |
commit | dde34a27133632aa7892eb4533890aea5ea04efb (patch) | |
tree | ebf708f7b9ffa63b5b35ed33171a4597879f482a /src/2021/day7/aoc.cpp | |
parent | 751c279cefea73b01f6f2457b9c65477d6f2df8d (diff) | |
download | advent-of-code-dde34a27133632aa7892eb4533890aea5ea04efb.tar.gz advent-of-code-dde34a27133632aa7892eb4533890aea5ea04efb.zip |
2021 day7
Diffstat (limited to 'src/2021/day7/aoc.cpp')
-rw-r--r-- | src/2021/day7/aoc.cpp | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/2021/day7/aoc.cpp b/src/2021/day7/aoc.cpp index 6ba7c29..8bc4607 100644 --- a/src/2021/day7/aoc.cpp +++ b/src/2021/day7/aoc.cpp @@ -12,17 +12,24 @@ static void get_number(const char** pp, int* d) { *pp = p; } -int fuel(int a, const std::map<int, int>& is) { - int total{0}; +int crab_move(int x, int y) { + int b = std::abs(x - y); + return b * (b + 1) / 2; +} + +std::pair<int, int> fuel(int a, const std::map<int, int>& is) { + int t0{0}; + int t1{0}; for (auto& kv : is) { if (kv.first != a) { - total += std::abs(a - kv.first) * kv.second; + t0 += std::abs(a - kv.first) * kv.second; + t1 += crab_move(a, kv.first) * kv.second; } } - return total; + return {t0, t1}; } -int day7(line_view file) { +std::pair<int, int> day7(line_view file) { std::map<int, int> is; const char* p1 = file.line; const char* p2 = p1 + file.length; @@ -39,16 +46,19 @@ int day7(line_view file) { p1++; } - int min{INT32_MAX}; + int m1{INT32_MAX}; + int m2{INT32_MAX}; for (int i = mi; i <= mx; i++) { - int f = fuel(i, is); - // printf("%d -> %d\n", i, f); - if (f < min) { - min = f; + auto p = fuel(i, is); + // printf("%d -> (%d, %d)\n", i, p.first, p.second); + if (p.first < m1) { + m1 = p.first; + } + if (p.second < m2) { + m2 = p.second; } } - - return min; + return {m1, m2}; } } // namespace aoc2021 |