티스토리 뷰
https://www.acmicpc.net/problem/23254
23254번: 나는 기말고사형 인간이야
192시간 동안 1번 과목을 35시간, 2번 과목을 43시간, 3번 과목을 30시간, 4번 과목을 17시간, 5번 과목을 37시간, 6번 과목을 30시간동안 공부하면 1, 2, 3, 4, 6번 과목은 100점, 5번 과목은 77점, 7번 과목은
www.acmicpc.net

문제
중간고사를 시원하게 망친 찬우는 오늘부터 1분도 쉬지 않고 기말고사 공부에 매진하기로 다짐했다.
기말고사는 정확히 24×시간 이후에 시작되며, 쉬는 시간 없이 하루에 모든 과목의 시험을 보기 때문에 찬우는 24×시간동안 공부할 수 있다. 기말고사를 보는 과목은 총 개로, 시험 시간이 빠른 과목부터 각각 1부터 �까지의 번호가 매겨져 있다. 모든 과목의 최저점은 0점, 최고점은 100점이다.
찬우는 공부를 하나도 하지 않아도 번 과목에서 점을 받을 수 있으며, i번 과목을 정확히 한 시간 공부할 때마다 그 과목의 성적을 점 올릴 수 있다. 하지만 번 과목을 30분 공부한다고 점이 오르지는 않으며, 아무리 공부하더라도 한 과목에서 최고점인 100점이 넘는 점수를 받을 수는 없다.
모든 과목의 점수의 합이 찬우의 최종 성적이 된다. 높은 성적을 받기 위한 최적의 전략으로 공부할 때, 찬우가 받을 수 있는 최종 성적의 최댓값을 출력하는 프로그램을 작성하시오.
유형 : 그리디 + 우선순위 큐
접근 방식
- 정렬 기준은 간단하다. 1시간 대비 가장 높은 점수가 오르는 과목을 많이 공부하면 된다. 즉 plus 점수를 기준으로 정렬하면 된다.
- 단 정말 주의할 점이 있는데 50점을 올릴 수 있는데 1시간 마다 3점이 오른다 가정하자
- 결국 16시간 공부하면 48 점이 오르는데 여기서 1시간을 더 공부하면 2점이 오른다. (점수 최대치 : 100점)
- 근데 뒤에 있는 과목은 1시간 당 1점이 오른다면....???
- 그렇다. 앞의 과목을 1시간 더 공부하고 2점을 올리는게 효과적이다.
- 위 방식을 구현 하는 방법은 간단하다. 1시간 더 공부해서 올릴 수 있는 점수를 구하고 우선순위 큐에 추가 해주면 된다.
- 위와 같이 할 경우 알아서 다음 큐 탐색 때 해당 시간과 점수를 고려할 수 있다.
전체 코드
import java.util.*;
import java.io.*;
public class Main {
static int n = 0;
static int m = 0;
static int[] score;
static int[] plus;
static int total = 0;
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb =new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
score = new int[m];
plus = new int[m];
PriorityQueue<Node> pq = new PriorityQueue<>(
(x,y) -> y.plus - x.plus
);
st = new StringTokenizer(bf.readLine(), " ");
for(int i=0;i<m;i++){
score[i] = Integer.parseInt(st.nextToken());
total += score[i];
}
st = new StringTokenizer(bf.readLine(), " ");
for(int i=0;i<m;i++){
plus[i] = Integer.parseInt(st.nextToken());
pq.add(new Node(100 - score[i],plus[i]));
}
int time = 24 * n;
while(!pq.isEmpty()){
Node cur = pq.poll();
if(time >= (cur.rest / cur.plus)){
time -= cur.rest / cur.plus;
total += cur.plus * (cur.rest / cur.plus);
if(cur.rest % cur.plus >= 1){
pq.add(new Node(cur.rest % cur.plus,cur.rest % cur.plus));
}
}else if(time > 0 && (cur.rest >= time * cur.plus)){
total += time * cur.plus;
time = 0;
}
}
System.out.println(total);
bf.close();
}
}
class Node{
int rest;
int plus;
Node(int rest,int plus){
this.rest = rest;
this.plus = plus;
}
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 2307 (도로 검문) - java (0) | 2023.11.29 |
|---|---|
| 백준 14728 (벼락치기) - java (0) | 2023.11.28 |
| 백준 3987 (보이저 1호) - java (1) | 2023.11.27 |
| 백준 17404 (RGB 거리 2) - java (1) | 2023.11.22 |
| 백준 1379 (강의실 2) - java (1) | 2023.11.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #4963 #섬의 개수
- 백준
- 백준 #인구 이동 #16234
- 백준 #1325 #효율적인 해킹
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 백준 #18405 #경쟁적 전염
- 17218
- 백준 #1987 #알파벳 #자바 #java
- 백준 #
- 백준 #17940 #주식 #자바 #java
- 백준 #2636 #치즈
- 자바
- 백준 #다리 만들기 #2146
- 올해보다
- 백준 #1584 #게임 #java #자바
- 백준 #1759 #암호 만들기
- Java
- 백준 #25603 #짱해커 이동식 #java #자바
- 17394
- 백준 #12014 #주식 #자바 #java
- 백준 #15686 #치킨 배달
- 백준 #13549 #숨바꼭질3
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #14863 #서울에서 경산까지 #java #자바
- 자바 #JAVA
- 백준 #16973 #직사각형 탈출
- 백준 #3980 #선발 명단
- 백준 #2580 #스도쿠
- 행복합시다.
- 백준 #치즈 #2638
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함