a,b개의 빨강, 파랑 타일이 주어진다.
이 두개를 잘 섞어서 다음 조건을 만족할 때 둘레의 길이의 최소값을 구하는 문제다.
1. 둘다 모두 써야한다.
2. 어느 한 부분만 돌출되어도 안되고 중간이 비어서도 안되며 정확히 꽉찬 직사각형 형태를 이뤄야 한다.
3. 두 색 중 반드시 하나는 직사각형 내부에서 직사각형 형태를 띄고 있어야 한다.
사각형의 특성상 같은 타일 개수를 사용했을 때 정사각형일 때가 가장 둘레의 길이가 적다.
부터 1까지 돌면서 a+b나누어 떨어지는지 확인하고 나누어 떨어진다면
a혹은 b가지고 그 직사각형 내부에서 직사각형을 형성할 수 있는지 확인하면 된다.
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 | #include <iostream> #include <algorithm> #include <math.h> using namespace std; typedef long long ll; ll a, b, s; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> a >> b; s = a + b; if (a > b) swap(a, b); ll i = sqrt(s); ll ans = 2e17; for (; i >= 1; --i) if ((s%i) == 0) { ll r = sqrt(a), f = 0; r = min(r, i); for (ll j = r; j >= 1; --j) { if ((a%j) == 0 && j <= i && (a / j) <= (s / i)) { cout << (i * 2 + (s / i) * 2); return 0; } } if (!f) { r = sqrt(b); r = min(r, i); for (ll j = r; j >= 1; --j) { if ((b%j) == 0 && j <= i && (b / j) <= (s / i)) { cout << (i * 2 + (s / i) * 2); return 0; } } } } return 0; } | cs |
'codeforces > #506 div3' 카테고리의 다른 글
D. Concatenated Multiples (0) | 2018.08.29 |
---|---|
C. Maximal Intersection (0) | 2018.08.29 |
B. Creating the Contest (0) | 2018.08.29 |
A. Many Equal Substrings (0) | 2018.08.29 |