https://www.acmicpc.net/problem/2512
미쳤다 나는 아무리 생각해도 내방법으로 푸는 거 밖에 생각 못했는데 진짜 답 보니까 충격적이다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
물론 내 방법도 sort를 해야한다는 것이 엄청 좋은 방법은 아니었지만 ㅠ
답 보니까 헉 소리나옴
제대로 된 정답은 따로 안 올린당... 힌트는 이분탐색으로 푸는 거라는 거..
밑에는 내가 짰던 코드!!
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 61 62 63 | #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace std; vector <int> arr; int main(void) { int N; int M; int value = 0; // 값 int sum = 0; // 부분 누적 합 int max_value = 0; // 상한액 int sum_value = 0; // 전체 누적 합 scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &value); arr.push_back(value); // 가장 큰 값 저장해두기 if (max_value < value) max_value = value; // 다 합친 값 저장해두기 sum_value += value; } scanf("%d", &M); // 할당할 수 있는 예산보다 합친 값이 크면 상한액 구하기 if (M < sum_value) { // 상한액은 평균에서부터 시작 max_value = M/N; // 배열을 오름차순으로 정렬 sort(arr.begin(), arr.end()); // 배열의 값을 누적해가며 현재까지 배정될 수 있는지 확인 for (int i = 0; i < N; i++) { // 상한액 누적 sum += arr[i]; // 배열의 값이 이전에 구해놓은 상한액보다 크면 상한액을 갱신할 수 없다. if (arr[i] > max_value) break; // 현재까지 누적하여 구한 상한액이 이전 배열 값보다 크거나 같으면 상한액을 갱신 else { max_value = (M - sum) / (N - (i+1)); } } } printf("%d\n", max_value); return 0; } | cs |
'Problem > 이분탐색' 카테고리의 다른 글
[C/C++] BOJ 12738 :: 가장 긴 증가하는 부분 수열 3 (0) | 2019.02.25 |
---|---|
[C/C++] BOJ 12015 :: 가장 긴 증가하는 부분 수열 2 (0) | 2019.02.25 |
[C/C++] BOJ 2805 :: 나무 자르기 (0) | 2019.01.19 |
[백준알고리즘] 1074번 Z (0) | 2018.11.22 |