백준-보석 상자(2792)

computer_log·2023년 9월 1일
0
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m;
vector<int>v;
int minN;
int check(int mid) {
	int cnt = 0;
	for (int i = 0; i < m; i++) {
		cnt += v[i] / mid;
		if (v[i] % mid != 0)cnt++;
	}
	return cnt;
}
int main() {
	freopen_s(new FILE*, "input.txt", "r", stdin);
	cin >> n;
	cin >> m;
	for (int i = 0; i < m; i++) {
		int x;
		cin >> x;
		v.push_back(x);
	}
	sort(v.begin(), v.end(), less<>());
	int start =0;
	int end= v[v.size() - 1];

	while (start <= end) {
		int mid = (start + end) / 2;
		int ret = check(mid);
		if (ret > n) {
			//충족, 근데 더 작으값 구해야함
			start = mid + 1;
		}
		else {
			end = mid - 1;
			minN = mid;
		}
		
	}
	cout << minN << "\n";
	return 0;
}

구한 범위 내에서 최솟값 을 구하는거였다,,
첨에좀 헷갈렸음,,

이런종류 많이 풀어보기

[수정코드]

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
vector<int>v;
int minN;
int check(int mid) {
	int cnt = 0;
	for (int i = 0; i < m; i++) {
		if (v[i] > mid) {
			cnt += (v[i]/mid);
			if (!(v[i] % mid == 0))cnt++;
		}
		else {
			cnt++;
		}
	}
	return cnt;
}
int main() {
	/*freopen_s(new FILE*, "input.txt", "r", stdin);*/
	cin >> n;
	cin >> m;
	for (int i = 0; i < m; i++) {
		int x;
		cin >> x;
		v.push_back(x);
	}
	sort(v.begin(), v.end(), less<>());
	int start =1;
	int end= v[v.size() - 1];
	while (start <= end) {
		int mid = (start + end) / 2;
		int ret = check(mid);
		if (ret <= n) {
			end = mid - 1;
			minN = mid;
		}
		else {
			start = mid + 1;
		}
	}
	cout << minN << "\n";
	return 0;
}

런타임 에러 (DivisionByZero)
떠서 수정함 ㅠㅠ

profile
computer_log

0개의 댓글