알고리즘/BAEKJOON
백준 2805번 나무자르기
pureworld
2019. 9. 15. 21:36
백준 2805번 나무자르기
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <iostream> #include <queue> #include<stack> #include <cmath> #include<string> #include<vector> #include<algorithm> #include <cstring> //memset using namespace std; int n; long long m; long long Max = 2000000000; long long Min = 1; long long tree[1000001]; long long Cut_Tree(int mid) { long long ret = 0; for (int i = 1; i <= n; i++) { long long ans = tree[i] - mid; if (ans > 0) { ret += ans; } } return ret; } int main(void){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for (int i = 1; i <=n; i++) cin >> tree[i]; long long high = Max; long long low = Min; long long mid; long long ans=0; while (low <=high) { mid = (low + high) / 2; long long ret = Cut_Tree(mid); if (ret >= m) { ans = max(ans, mid); low = mid+1; } else { high = mid - 1; } } cout << ans << endl; return 0; } | cs |
문제 출처:https://www.acmicpc.net/problem/2805
이분 탐색 문제였습니다.
long long이 아니라 int형으로 풀고있으니 당연히 오답이 뜨는것을...