일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BFS
- 백준
- ISER
- DP
- 소프티어
- 마법의숲탐색
- 나무박멸
- DenseDepth
- ARM
- 코드트리빵
- dfs
- 루돌프의반란
- 토끼와 경주
- 삼성기출
- 왕실의기사대결
- 싸움땅
- ros
- 마이크로프로세서
- 3Dreconstruction
- 순서대로방문하기
- 구현
- 수영대회결승전
- 코드트리
- Calibration
- 시뮬레이션
- 포탑부수기
- 이진탐색
- 조합
- ICER
- 슈퍼컴퓨터클러스터
Archives
- Today
- Total
from palette import colorful_colors
[Softeer] 슈퍼컴퓨터 클러스터 with C++ (HSAT 4회 기출) 본문
https://softeer.ai/practice/6252
언어: C++, 시간: 36ms
접근방법
N이 크기 때문에 시간 최적화가 필요하다.
난 이진탐색의 업그레이드 버전인 Parametric search(매개변수 탐색)을 이용했다.
1. 문제에서 가능한 정답의 범위(최선의 최소 컴퓨팅 성능):
성능이 가장 낮은 컴퓨터 ~ 성능이 가장 높은 컴퓨터 + B의 루트 값
2. 최선의 최소 컴퓨팅 성능이 num일 때 예산 안에서 업그레이드가 가능한지 판별하는 함수 isPossible을 만들어준다!
이후 가능한 정답 범위에서 이진탐색을 한다! → isPossible이 true면 start = mid + 1, false면 end = mid -1로 업데이트
이걸 하기 위해선 먼저 컴퓨터들을 오름차순으로 정렬해주어야 한다.
주의사항
문제에서 예산 B가 int 범위를 넘어가므로 long long이 필요하다!🫥
최종코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int N, temp;
long long B, minNum, maxNum;
vector <int> computers;
// 최소 컴퓨터 성능을 num으로 만들때 예산 안에서 가능한지를 판별한다.
bool isPossible(long long num) {
long long sum = 0;
for (int i = 0; i < N; i++) {
if (computers[i] >= num)
break;
long long gap = (num - computers[i]);
sum += (gap * gap);
if (sum > B)
return false;
}
return true;
}
// start ~ end 중 최소 컴퓨터 성능의 최댓값을 반환하는 함수
long long ps(long long start, long long end) {
long long answer = 0;
while (start <= end) {
long long mid = (start + end) / 2;
if (isPossible(mid)) {
answer = mid;
start = mid + 1;
}
else
end = mid - 1;
}
return answer;
}
int main() {
//freopen("sample_input.txt", "r", stdin);
cin >> N >> B;
for (int i = 0; i < N; i++) {
cin >> temp;
computers.push_back(temp);
}
sort(computers.begin(), computers.end()); // 오름차순 정렬
minNum = computers[0];
maxNum = computers[N - 1];
cout << ps(minNum, (int)(sqrt(B))); // parametric search로 구한 것 출력하기
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 주사위 고르기 with C++ (2024 카카오 겨울 인턴십) (0) | 2024.05.05 |
---|---|
[백준] RGB거리 with C++ (1) | 2024.05.01 |
[백준] 1715 카드 정렬하기 with C++ (1) | 2024.05.01 |
[코드트리] 예술성 with C++ (삼성기출) (0) | 2024.04.21 |
[코드트리] 마법의 숲 탐색 with C++ (삼성기출) (1) | 2024.04.19 |