본문 바로가기
Problem Solving/코드포스

[코드포스] 1283B : Candies Division

by shinbian11 2020. 7. 6.

https://codeforces.com/contest/1283/problem/B

 

Problem - B - Codeforces

 

codeforces.com


<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개 >> 이렇게 주면 된다.)