728x90
https://www.acmicpc.net/problem/2805
이 문제도 이분탐색을 물어보는 문제였다.
랜선자르기 문제(1654번)과 거의 동일한 구조이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <iostream>
using namespace std;
int N;
long long meter_of_tree;
long long tree[1000001];
bool ispossible(int height){
long long count=0;
for(int i=0; i<N; i++){
if(tree[i]>height)
count+=tree[i]-height;
}
if(count>=meter_of_tree)
return true;
else
return false;
}
int main(void){
cin>>N>>meter_of_tree;
long long high=0;
for(int i=0; i<N; i++) {
cin >> tree[i];
if(high<tree[i])
high=tree[i];
}
long long low=1;
long long result_height=0;
while(low<=high){
// cout<<high<<" "<<low<<"\n";
long long mid= (high+low)/2;
// cout<<"mid is "<<mid<<"\n";
if(ispossible(mid)){
if (result_height<mid)
result_height = mid;
low=mid+1;
}
else{
high = mid-1;
}
}
cout<<result_height;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
이문제를 맞추기 전에 한번 틀렸었는데,
31번째 줄에 while(low<=high) 를 while(low<high)로쓴
것 뿐이었는데 틀렸다고 결과가 떴다. *코드길이가 1B밖에 차이안남.
그 이유를 봤었는데 (ac받은 코드들 참조하면서)
결국 지금 mid 값보다 무조건 크거나 작은 값을 참조해야 하는건 맞는거고,
low=high의 순간은 결국 low=mid=high 가 되는 것과 마찬가지가 되기 때문에.
(사실 low<high라고 할 경우엔 어떤 차이점이 생기는지 잘 떠오르지 않는다..)
이건 기회되면 더 알아보도록 하자.
'알고리즘 > 백준' 카테고리의 다른 글
백준 1780 종이의 개수 - 분할정복 - C++ (0) | 2020.01.23 |
---|---|
백준 2110 공유기 설치 - 이분탐색 C++ (0) | 2020.01.22 |
백준 1654 랜선자르기(이분탐색)-C++ (0) | 2020.01.22 |
백준 9663 N-Queen (백트래킹(가지치기), 재귀함수) - C++ (0) | 2020.01.22 |
백준 9012 괄호 (문자열)- C++ (0) | 2020.01.20 |