#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)
떠서 수정함 ㅠㅠ