라이브러리는 도서관 아닌가요

백준 (BOJ) 25391 특별상 java greedy 본문

알고리즘 문제

백준 (BOJ) 25391 특별상 java greedy

veryhi 2022. 9. 7. 00:43

https://www.acmicpc.net/problem/25391

 

25391번: 특별상

주최자가 첫 번째와 네 번째 학생을 골라서 특별상을 줄 경우 심판은 자신이 매긴 점수에 따라 두 번째, 여섯 번째, 일곱 번째 학생에게 상을 주게 된다. 이때 상을 받은 $5$명의 작품에 대해 주최

www.acmicpc.net

문제의 전제에 대한 설명이 좀... 음...

 

 

 

'일반적으로' 생각했을 때, 본상 수상자 먼저 선정하고 특별상을 정한다는 것을 전제로 하고 있다.

 

따라서 심판이 준 점수에 따라 본상 수상자를 뽑은 후,

 

남은 사람들 중에서 주최자가 특별상 수상자를 뽑는다.

 

이것만 알면 사실 평이한 문제

 

...혹시 나만 헤맨 건가?

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[][] arr = new int[n][2];
        for(int i=0; i<n; ++i){
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arr, (e1, e2) -> {
            if(e1[1] == e2[1]) return e2[0] - e1[0];
            else return e2[1] - e1[1];
        });

        long max = 0;
        for(int i=0; i<k; ++i){
            max += arr[i][0];
        }

        int[][] remained = new int[n-k][2];
        for(int i=0; i<n-k; ++i){
            remained[i][0] = arr[i+k][0];
            remained[i][1] = arr[i+k][1];
        }

        Arrays.sort(remained, (e1, e2) ->{
            if(e1[0] == e2[0]) return e2[1] - e1[1];
            else return e2[0] - e1[0];
        });

        for(int i=0; i<m; ++i){
            max += remained[i][0];
        }
        System.out.print(max);

    }
}
Comments