이분탐색 문제였다. 아래 링크 참고해서 개념 이해하고 풀었다. 이분탐색 전에 배운 적 있었는데 코드로는 처음 짜봐서 신기했음,,
http://blog.naver.com/kks227/220777333252
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using i64 = long long;
bool cut(int mid,int m, vector<int> v){
i64 sum = 0;
for(int i = 0; i < v.size(); i++)
sum += max(0, v[i]-mid);
if(sum >= m)
return true;
else
return false;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
vector<int> v(n);
for(int i = 0; i < n; i++)
scanf("%d", &v[i]);
int low = 0;
int high = *max_element(v.begin(), v.end());
while (true){
if(low == high-1)
break;
int mid = (low+high)/2;
if(cut(mid, m, v))
low = mid;
else
high = mid;
}
printf("%d", low);
return 0;
}
처음 제출했을 때 틀렸는데 알고보니 sum 구할 때 오버플로우가 발생했다. 입력 값이 커서 오버플로우 조심해야지 생각하다가 까먹고 long long 안 써서 틀렸다. 다음에는 더 조심하도록 하자.
'백준' 카테고리의 다른 글
2512 예산 (0) | 2019.11.06 |
---|---|
1654 랜선 자르기 (0) | 2019.11.06 |
1427 소트인사이트 (0) | 2019.11.03 |
2810 컵홀더 (0) | 2019.11.02 |
15904 UCPC는 무엇의 약자일까? (0) | 2019.11.02 |