[BOJ 18319] Berry Picking

2023. 5. 13. 11:01Baekjoon

728x90

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

 

18319번: Berry Picking

Bessie and her little sister Elsie are picking berries in Farmer John's berry patch. Farmer John's patch has exactly $N$ berry trees ($1\le N\le 1000$); tree $i$ contains exactly $B_i$ berries ($1\le B_i\le 1000$). Bessie has exactly $K$ baskets ($1 \le K

www.acmicpc.net

 

- 문제 요약

 

베시와 그녀의 여동생 엘시는 농부 존의 베리밭에서 딸기를 따고 있습니다.

농부 John의 경작지에는 정확히 N개의 berry 나무가 있습니다
나무 i는 정확히 Bi 열매를 포함하고 있습니다
Bessie는 정확히 K 바구니를 가지고 있습니다
각각의 바구니는 베시가 원하는 만큼 한 나무의 열매를 담을 수 있지만, 맛이 서로 충돌하기 때문에 두 개의 다른 나무의 열매는 담을 수 없습니다. (바구니는 비어 있을 수 있습니다.)
Bessie는 그녀가 수집하는 베리의 수를 최대화하기를 원합니다.

하지만, 농부 존은 베시가 그녀의 여동생과 나눠 먹기를 원하기 때문에 베시는 엘시에게 가장 많은 수의 베리가 있는 K/2 바구니를 주어야 할 것입니다.

이것은 엘시가 심지어 베시보다 더 많은 열매를 맺게 될 수도 있다는 것을 의미하는데, 이것은 매우 불공평하지만, 불행히도 형제 역학이 항상 공평하지는 않습니다.
베시가 수집할 수 있는 최대 베리 수를 파악할 수 있도록 도와주세요.

 

 

- 알고리즘 정리

 

나무가 N개 있고, i번째 나무에는 Bi개의 열매가 달려있다고 했습니다.

최적의 경우에는 Bessie가 가지고 있는 모든 K-1개의 양동이에 베리가 하나씩 들어있어야 합니다. 

양동이를 하나씩 소비해 가면서 열매를 수확할 때, K개의 양동이를 다 쓰거나 모든 트리에 남아있는 딸기의 개수보다 적어질 때까지 반복문을 돌리면서 크기가 j인 양동이를 채워야 합니다.

이는 큰 값에서 작은 값으로 시행해야 합니다.

 

 

- 코드 작성

 

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

#define MAX 100001
int n,k,arr[MAX],mod;

bool cmp(int a,int b){
	return (a%mod)>(b%mod);
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n>>k;
	int mx=0,result=0; 
	for(int i=0;i<n;i++){
		cin>>arr[i];
		mx=max(mx,arr[i]);
	} 
	for(int j=1;j<=mx;j++){
		int full=0;
		for(int i=0;i<n;i++){
			full+=arr[i]/j;
		}
		if(full<k/2){
			break;
		}
		if(full>=k){
			result=max(result,j*(k/2));
			continue;
		}
		mod=j;
		sort(arr,arr+n,cmp);
		int cur=j*(full-k/2);
		for(int i=0;i<n&&i+full<k;i++){
			cur+=arr[i]%j;
		}
		result=max(result,cur);
	}
	cout<<result<<'\n';
}

코드 제출 결과

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 10999] 구간 합 구하기 2  (0) 2023.05.14
[BOJ 13975] 파일 합치기 3  (1) 2023.05.13
[BOJ 17144] 미세먼지 안녕!  (1) 2023.05.12
[BOJ 15998] 카카오머니  (0) 2023.05.12
[BOJ 13710] XOR 합 3  (0) 2023.05.11