알고리즘

백준 1049 기타줄

킨글 2024. 9. 19. 22:48

설명

  • 최소 금액을 구하는 문제이다.
  • 고민이 됐었지만, 6으로 나눠서 가장 많이 갯수를 채우고 + 나머지 1로 가장 많이 갯수를 채우면 되는 것으로 확인되었다.
  • 6으로 나눈값과 + 나머지를 혼합하는 케이스만 처음에 제출했었는데 틀렸다.
  • 6으로만 하는게 가장 싼 경우가 있기 때문이다. 그래서 해당 케이스를 추가해서 제출했는데 틀렸다.
  • 1으로만 하는게 가장 싼 경우가 있기 때문이다. 

반례(1으로만 하는게 가장 싸다 2*12 = 24)

12 2
20 4
15 2
24

 

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

    // 1049
    public static void main(String[] args) throws IOException {
        process();
    }

    private static void process() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        final int N = Integer.parseInt(st.nextToken());
        final int M = Integer.parseInt(st.nextToken());

        final int sixCnt = N / 6;
        final int onCnt = N % 6;
        int minSixPrice = Integer.MAX_VALUE;
        int minOnePrice = Integer.MAX_VALUE;

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            minSixPrice = Math.min(minSixPrice, Integer.parseInt(st.nextToken()));
            minOnePrice = Math.min(minOnePrice, Integer.parseInt(st.nextToken()));
        }

        final int mixPrice = minSixPrice * sixCnt + minOnePrice * onCnt;
        final int onlySixPrice = (sixCnt+1) * minSixPrice;
        final int onlyOnePrice = minOnePrice * N;

        bw.write(Math.min(onlyOnePrice, Math.min(mixPrice, onlySixPrice)) + "");
        bw.flush();
        bw.close();
        br.close();
    }
}