작성일 :

문제 링크

8246번 - Stół

설명

직사각형 테이블과 정사각형 의자가 주어질 때, 의자 등받이가 테이블 변과 겹치도록 배치할 수 있는 최대 개수를 구하는 문제입니다.


접근법

먼저 K가 A 또는 B보다 크면 의자 한 개도 들어가지 않으므로 0을 출력합니다.

다음으로 A 또는 B가 2K보다 작다면 그 방향으로는 의자 두 개가 겹치지 않게 놓일 수 없습니다. 이때는 긴 변을 따라 K씩 배치할 수 있는 개수인 max(A, B) / K가 최댓값입니다.

이후 두 변이 모두 2K 이상이면 네 변을 따라 배치할 수 있습니다. 각 변에 A / K, B / K개씩 놓되, 네 모서리는 서로 중복되므로 4개를 빼서 2*(A / K) + 2*(B / K) - 4를 사용합니다.

마지막으로 위 조건에 따라 값을 출력합니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;

class Program {
  static void Main() {
    var input = Console.ReadLine()!.Split();
    var a = long.Parse(input[0]);
    var b = long.Parse(input[1]);
    var k = long.Parse(input[2]);

    long ans;
    if (k > a || k > b) ans = 0;
    else if (a < 2 * k || b < 2 * k) ans = Math.Max(a, b) / k;
    else ans = 2 * (a / k) + 2 * (b / k) - 4;
    
    Console.WriteLine(ans);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  ll a, b, k;
  if (!(cin >> a >> b >> k)) return 0;

  ll ans;
  if (k > a || k > b) ans = 0;
  else if (a < 2 * k || b < 2 * k) ans = max(a, b) / k;
  else ans = 2 * (a / k) + 2 * (b / k) - 4;

  cout << ans << "\n";
  return 0;
}