문제
https://codeforces.com/problemset/problem/1409/B
걸린 시간
00 : 55 : 43
풀이
C++
#include <bits/stdc++.h>
#define INF 1e18
typedef long long ll;
using namespace std;
ll a, b, x, y, n;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int tc;
cin >> tc;
while(tc--){
cin >> a >> b >> x >> y >> n;
ll A, B, N, decN, ans = INF;
ll decA = a-x, decB = b-y;
// A -> B
A = a, B = b, N = n;
decN = min(N, decA);
N -= decN;
A -= decN;
decN = min(N, decB);
B -= decN;
ans = min(ans, A*B);
// B -> A
A = a, B = b, N = n;
decN = min(N, decB);
N -= decN;
B -= decN;
decN = min(N, decA);
A -= decN;
ans = min(ans, A*B);
cout << ans << "\n";
}
return 0;
}
문제는 두 수 a, b를 문제의 조건을 만족하는 범위에서 n만큼 적절히 나누어 각각 감소시켰을 때, 두 수의 곱이 최소가 되도록 하려고 한다.
처음엔 값이 최소가 되는 경우를 여러 가지 생각해보고 주어진 값에 따라 처리를 다르게 하려 했지만 경우의 수가 너무 많았다. 다시 잘 생각해보니 두 수 a, b에서 가능한 대로 n만큼 모두 감소시키기 때문에 나올 수 있는 경우의 수는 1) a를 최대한 감소시키고 남은 값으로 b를 감소, 2) b를 최대한 감소시키고 남은 값으로 a를 감소 두 가지뿐이였다.
값의 범위를 잘 고려하면서 두 가지 경우의 값을 구해 비교한 후 최소값을 출력하면 된다.
'Codeforces' 카테고리의 다른 글
Codeforces #1419A Digit Game (0) | 2020.09.20 |
---|---|
Codeforces #1409C Yet Another Array Restoration (0) | 2020.09.19 |
Codeforces #1399B Gifts Fixing (0) | 2020.09.18 |
Codeforces #1399A Remove Smallest (0) | 2020.09.18 |
Codeforces #1401A Distance and Axis (0) | 2020.09.16 |
댓글