[백준 22093] Соцопрос (C#, C++) - soo:bak
작성일 :
문제 링크
설명
문제를 풀 수 있는 사람과 싫어하는 사람의 수가 주어질 때, 실제로 문제를 푼 사람의 최소·최대 인원을 구하는 문제입니다.
접근법
문제를 푼 사람은 풀 수 있으면서 싫어하지 않는 사람입니다. 풀 수 있는 사람 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;
}