작성일 :

문제 링크

22093번 - Соцопрос

설명

문제를 풀 수 있는 사람과 싫어하는 사람의 수가 주어질 때, 실제로 문제를 푼 사람의 최소·최대 인원을 구하는 문제입니다.


접근법

문제를 푼 사람은 풀 수 있으면서 싫어하지 않는 사람입니다. 풀 수 있는 사람 a명과 싫어하는 사람 b명의 교집합 크기를 알 수 없으므로, 교집합이 가장 클 때와 가장 작을 때를 각각 계산합니다.

교집합이 최대일 때 푼 사람이 최소가 되고, 교집합이 최소일 때 푼 사람이 최대가 됩니다. 최소 푼 사람 수는 a - b와 0 중 큰 값이고, 최대 푼 사람 수는 a와 n - b 중 작은 값입니다.


Code

C#

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

class Program {
  static void Main() {
    var t = int.Parse(Console.ReadLine()!);

    for (var i = 0; i < t; i++) {
      var p = Console.ReadLine()!.Split();
      var n = int.Parse(p[0]);
      var a = int.Parse(p[1]);
      var b = int.Parse(p[2]);

      var minSolve = Math.Max(0, a - b);
      var maxSolve = Math.Min(a, n - b);
      Console.WriteLine($"{minSolve} {maxSolve}");
    }
  }
}

C++

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

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

  int t; cin >> t;

  while (t--) {
    int n, a, b; cin >> n >> a >> b;
    int minSolve = max(0, a - b);
    int maxSolve = min(a, n - b);
    cout << minSolve << ' ' << maxSolve << "\n";
  }

  return 0;
}