https://codeforces.com/contest/1283/problem/B
<C++>
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int tc;
cin >> tc;
for (int i = 0; i < tc; ++i) {
int n, k;
cin >> n >> k;
int ans = n - n % k; //나올 수 있는 답의 최소
ans += min(n % k, k / 2);
cout << ans << endl;
}
}
> 캔디가 n개이고, 어린이가 k명이라는 것은 최소한 k명의 어린이들에게 n/k개의 사탕을 나눠줄 수 있다는 말이다.
예를 들자면 4명의 아이들에게 19개의 사탕을 나눠주려면 최소한 4개씩은 각각 일단 나눠줄 수 있다는 말이다.
그러므로 출력하고자 하는 답인 ans는 최소 n-n%k이다.
> 문제에 제시된 조건 2개를 만족한다는 가정하에, 최대한 많은 사탕을 나눠줘야 하는 문제이므로
남은 n%k개의 사탕을 최대한 1개씩 아이들에게 각각 나눠줘야 한다. n%k와 k/2의 최소값을 구해서 방금 전에 구한 ans에 더해주면 된다. n%k와 k/2의 최소값을 구하는 이유는, 사탕을 1개 더 받을 수 있는 아이들의 최대 수는 ⌊k/2⌋ 이기 때문이다.
> 예를 들어, n:19, k:4일때, 4명의 아이들에게 4개씩 사탕을 나눠주고, 남은 3개의 사탕(n%k==3)을 최대한 아이들에게 하나씩 나눠주면서 조건을 만족해야 한다. 이때 ⌊k/2⌋ 의 값은 2이므로, 많이 줘봤자 2개의 사탕을 1인 1개씩 아이들에게 나눠줄수 있다. 최대값을 구해야 하므로, 최대값인 2개의 사탕을 2명의 아이들에게 1개씩 나눠줬을때 모든 조건에 만족하는 최대값을 구할 수 있다. (4개 4개 5개 5개 >> 이렇게 주면 된다.)
'Problem Solving > 코드포스' 카테고리의 다른 글
[코드포스] 129A : Cookies (0) | 2020.08.07 |
---|---|
[코드포스] 822A : I'm bored with life (0) | 2020.07.02 |
[코드포스] 1316A : Grade Allocation (0) | 2020.07.01 |
[코드포스] 1374A : Required Remainder (0) | 2020.06.30 |