#include <iostream> #include <vector> #include <string> #include <numeric> #include <algorithm> #include <map> #include <set> #include <queue> #include <stack> int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); long long h, w; long long r = 0; std::stack<std::pair<long long, long long>> wall; std::cin >> h >> w; wall.push(std::make_pair(h, w)); long long n; std::cin >> n; std::vector<long long> dimensions(n); for (int i = 0; i < n; i++) { std::cin >> dimensions[i]; } while (!wall.empty()) { std::pair<long long, long long> current = wall.top(); wall.pop(); bool found = false; long long height = current.first; long long width = current.second; for (int i = n - 1; i >= 0; i--) { if (dimensions[i] <= height && dimensions[i] <= width) { long long inHeight = height / dimensions[i]; long long inWidth = width / dimensions[i]; r += inHeight * inWidth; if (inHeight * dimensions[i] < height) { wall.push(std::make_pair(height - inHeight * dimensions[i], width)); if (inWidth * dimensions[i] < width) { wall.push(std::make_pair(height - (height - inHeight * dimensions[i]), width - inWidth * dimensions[i])); } } else if (inWidth * dimensions[i] < width) { wall.push(std::make_pair(height, width - inWidth * dimensions[i])); } found = true; break; } } if (!found) { std::cout << -1 << std::endl; return 0; } } std::cout << r << std::endl; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <iostream> #include <vector> #include <string> #include <numeric> #include <algorithm> #include <map> #include <set> #include <queue> #include <stack> int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); long long h, w; long long r = 0; std::stack<std::pair<long long, long long>> wall; std::cin >> h >> w; wall.push(std::make_pair(h, w)); long long n; std::cin >> n; std::vector<long long> dimensions(n); for (int i = 0; i < n; i++) { std::cin >> dimensions[i]; } while (!wall.empty()) { std::pair<long long, long long> current = wall.top(); wall.pop(); bool found = false; long long height = current.first; long long width = current.second; for (int i = n - 1; i >= 0; i--) { if (dimensions[i] <= height && dimensions[i] <= width) { long long inHeight = height / dimensions[i]; long long inWidth = width / dimensions[i]; r += inHeight * inWidth; if (inHeight * dimensions[i] < height) { wall.push(std::make_pair(height - inHeight * dimensions[i], width)); if (inWidth * dimensions[i] < width) { wall.push(std::make_pair(height - (height - inHeight * dimensions[i]), width - inWidth * dimensions[i])); } } else if (inWidth * dimensions[i] < width) { wall.push(std::make_pair(height, width - inWidth * dimensions[i])); } found = true; break; } } if (!found) { std::cout << -1 << std::endl; return 0; } } std::cout << r << std::endl; } |