[BOJ 2878] 캔디캔디

2023. 5. 15. 17:14Baekjoon

728x90

https://www.acmicpc.net/problem/2878

 

2878번: 캔디캔디

첫째 줄에 M(1 ≤ M ≤ 2×109)와 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 친구들이 받고 싶어하는 사탕의 개수가 주어진다. 이 개수는 2×109보다 작으며, 친구들이 받고 싶어하는

www.acmicpc.net


- 문제 요약

 

택희는 M개의 사탕을 N명의 친구들에게 나누어 주려고 한다.

택희의 친구들은 문자로 사탕을 몇 개 받고 싶은지 보냈다.

만약 받고 싶은 개수만큼 사탕을 받지 못한다면, 그 친구는 분노하게 된다.

놀랍게도 택희는 친구들의 분노를 수치화할 수 있는데, 이것은 못 받는 사탕 개수의 제곱이다.

택희가 받은 사탕의 개수와 친구의 수, 그리고 그 친구들이 받고 싶어 하는 사탕의 개수가 주어졌을 때, 사탕을 적절히 나누어 주어 친구들의 분노의 합을 최소화해 그 값을 출력하는 프로그램을 작성하시오.

 

 

- 알고리즘 정리

 

각 친구들이 받고싶어하는 사탕의 개수보다 나눠주지 못하는 사탕의 개수가 작아야 효율적입니다.

=> min( i번째 사람이 받고 싶어하는 사탕의 개수, 남은 사탕 개수 / 남은 사람 수)

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 100001
typedef unsigned long long ll;
ll m,n,arr[MAX],sum,result;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>m>>n;
	for(int i=0;i<n;i++){
		ll a;
		cin>>a;
		arr[i]=a;
		sum+=a;
	}
	sort(arr,arr+n);
	sum-=m;
	for(int i=0;i<n;i++){
		ll tmp=min(arr[i],sum/(n-i));
		result+=(tmp*tmp);
		sum-=tmp;
	}
	cout<<result;
}

코드 제출 결과

 

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 2186] 문자판  (0) 2023.05.23
[BOJ 11657] 타임머신  (0) 2023.05.21
[BOJ 9661] 돌 게임 7  (0) 2023.05.15
[BOJ 10999] 구간 합 구하기 2  (0) 2023.05.14
[BOJ 13975] 파일 합치기 3  (1) 2023.05.13