일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 코드트리
- 구현
- 3Dreconstruction
- 코드트리빵
- DP
- ISER
- 왕실의기사대결
- 조합
- 포탑부수기
- 싸움땅
- ARM
- DenseDepth
- ICER
- 이진탐색
- Calibration
- 나무박멸
- 루돌프의반란
- 백준
- 슈퍼컴퓨터클러스터
- 마법의숲탐색
- 수영대회결승전
- ros
- 토끼와 경주
- 삼성기출
- dfs
- 순서대로방문하기
- 시뮬레이션
- 소프티어
- 마이크로프로세서
- BFS
Archives
- Today
- Total
from palette import colorful_colors
[백준] 1715 카드 정렬하기 with C++ 본문
https://www.acmicpc.net/problem/1715
언어: C++, 시간: 36ms
접근방법
정렬을 계속 반복하는 그리디 문제!
가장 작은 숫자가 top에 오는 pq를 만들고 난 후,
숫자들 중 가장 작은 숫자와 그 다음 숫자를 더하고, 이걸 정답 변수에 더해주고 난 후 다시 pq에 넣는다. ....
→ 이걸 pq 크기가 1이 될 때까지 반복하기
고려사항
이 문제는 모두 int로 풀이해도 된다.
문제에서 N은 10만, 카드묶음의 최대 숫자는 1000인데,
정답 변수에는 1000x10만 + 2000x5만 + 4000x2만5천 + 8000x만2500, ... 이런식으로 1억이 계속 더해진다.
이 때 log100000 = 16.609... 이므로, 1억이 16.609... 번 더해지는 셈이다.
약 16.6억 < 21억이므로 , int로도 충분하다😎
최종코드
#include <iostream>
#include <queue>
using namespace std;
int N, temp, answer;
priority_queue <int, vector<int>, greater<>> pq;
int main() {
cin >> N;
for (int i = 0; i < N; i++){
cin >> temp;
pq.push(temp);
}
while (1) {
if (pq.size() == 1)
break;
int lessFirst = pq.top();
pq.pop();
int lessSecond = pq.top();
pq.pop();
int newNum = lessFirst + lessSecond;
answer += newNum;
pq.push(newNum);
}
cout << answer;
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Softeer] 슈퍼컴퓨터 클러스터 with C++ (HSAT 4회 기출) (0) | 2024.05.01 |
---|---|
[백준] RGB거리 with C++ (1) | 2024.05.01 |
[코드트리] 예술성 with C++ (삼성기출) (0) | 2024.04.21 |
[코드트리] 마법의 숲 탐색 with C++ (삼성기출) (1) | 2024.04.19 |
[백준] 17825 주사위 윷놀이 with C++ (삼성기출) (0) | 2024.04.14 |