※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14368번 문제인 Fashion Police (Large)이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14368
14368번: Fashion Police (Large)
For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is an integer: the maximum number of days you will be able to avoid being taken to Fashion Jail. Then output y more lines, each of whi
www.acmicpc.net
\(1 \le j \le J\), \(1 \le p \le P\)를 만족하는 \(j\)와 \(p\)로 이루어진 각 순서쌍 \((j,p)\)에 대하여, 이 둘을 모두 포함하는 3-tuple \((j,p,s)\) (단, \(1 \le s \le S)\)는 많아야 K개임을 조건을 통해 알 수 있다. 따라서, 문제의 답은 항상 \(JPK\) 이하임을 관찰할 수 있다. 물론, 만들 수 있는 모든 tuple의 개수 \(JPS\)를 넘지는 못하므로, \(K\)가 \(S\)보다 클 경우 그 값이 \(S\)와 같다고 생각해도 좋을 것이다.
여기서 조금 더 관찰을 해보면 \(JPK\)개의 3-tuple \((j,p,s)\)를 항상 찾아낼 수 있는 방법이 있다는 것을 알 수 있다. 먼저 직접 생각을 해보고, 생각이 나지 않을 때에만 아래의 코드를 참고하는 것을 추천한다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T; cin >> T;
for (int t = 1; t <= T; t++) {
int J, P, S, K; cin >> J >> P >> S >> K;
if (K > S) K = S;
cout << "Case #" << t << ": " << J * P * K << '\n';
for (int j = 1; j <= J; j++) {
for (int p = 1; p <= P; p++) {
for (int k = 0; k < K; k++) {
cout << j << ' ' << p << ' ' << (j + p + k - 1) % S + 1 << '\n';
}
}
}
}
}
'BOJ' 카테고리의 다른 글
[BOJ 5489 // C++] Numbers (0) | 2023.05.07 |
---|---|
[BOJ 14367 // C++] Fashion Police (Small) (0) | 2023.05.06 |
[BOJ 14373 // C++] Technobabble (Small) (0) | 2023.05.04 |
[BOJ 14374 // C++] Technobabble (Large) (0) | 2023.05.03 |
[BOJ 14371 // C++] Close Match (Small) (0) | 2023.05.02 |