𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 2512번: μ˜ˆμ‚° - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 2512번: μ˜ˆμ‚° - C++

.23 2022. 2. 3. 17:17
문제

κ΅­κ°€μ˜ μ—­ν•  쀑 ν•˜λ‚˜λŠ” μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ μ‹¬μ‚¬ν•˜μ—¬ κ΅­κ°€μ˜ μ˜ˆμ‚°μ„ λΆ„λ°°ν•˜λŠ” 것이닀. κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑은 미리 μ •ν•΄μ Έ μžˆμ–΄μ„œ λͺ¨λ“  μ˜ˆμ‚°μš”μ²­μ„ λ°°μ •ν•΄ μ£ΌκΈ°λŠ” μ–΄λ €μšΈ μˆ˜λ„ μžˆλ‹€. κ·Έλž˜μ„œ 정해진 총앑 μ΄ν•˜μ—μ„œ κ°€λŠ₯ν•œ ν•œ μ΅œλŒ€μ˜ μ΄ μ˜ˆμ‚°μ„ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ λ°°μ •ν•œλ‹€.

  1. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μžˆλŠ” κ²½μš°μ—λŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•œλ‹€.
  2. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μ—†λŠ” κ²½μš°μ—λŠ” νŠΉμ •ν•œ μ •μˆ˜ μƒν•œμ•‘을 κ³„μ‚°ν•˜μ—¬ κ·Έ 이상인 μ˜ˆμ‚°μš”μ²­μ—λŠ” λͺ¨λ‘ μƒν•œμ•‘μ„ λ°°μ •ν•œλ‹€. μƒν•œμ•‘ μ΄ν•˜μ˜ μ˜ˆμ‚°μš”μ²­μ— λŒ€ν•΄μ„œλŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•œλ‹€. 

예λ₯Ό λ“€μ–΄, 전체 κ΅­κ°€μ˜ˆμ‚°μ΄ 485이고 4개 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ΄ 각각 120, 110, 140, 150이라고 ν•˜μž. 이 경우, μƒν•œμ•‘μ„ 127둜 작으면, μœ„μ˜ μš”μ²­λ“€μ— λŒ€ν•΄μ„œ 각각 120, 110, 127, 127을 λ°°μ •ν•˜κ³  κ·Έ 합이 484둜 κ°€λŠ₯ν•œ μ΅œλŒ€κ°€ λœλ‹€. 

μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­κ³Ό κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„μ˜ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λ„λ‘ μ˜ˆμ‚°μ„ λ°°μ •ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„μ—λŠ” μ§€λ°©μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ” μ •μˆ˜ N이 주어진닀. N은 3 이상 10,000 μ΄ν•˜μ΄λ‹€. λ‹€μŒ μ€„μ—λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ ν‘œν˜„ν•˜λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 주어진닀. 이 값듀은 λͺ¨λ‘ 1 이상 100,000 μ΄ν•˜μ΄λ‹€. κ·Έ λ‹€μŒ μ€„μ—λŠ” 총 μ˜ˆμ‚°μ„ λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ M이 주어진닀. M은 N 이상 1,000,000,000 μ΄ν•˜μ΄λ‹€. 

 

좜λ ₯

첫째 μ€„μ—λŠ” λ°°μ •λœ μ˜ˆμ‚°λ“€ 쀑 μ΅œλŒ“κ°’μΈ μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. 


이뢄탐색을 μ΄μš©ν•˜μ—¬ ν‘ΈλŠ” 문제.

 

μ²˜μŒμ— 1번 쑰건을 μƒκ°ν•˜μ§€ μ•Šκ³  초기 였λ₯Έμͺ½ 값을 M으둜 작으면 닡이 μ•ˆλ‚˜μ˜¨λ‹€.... λ”°λΌμ„œ M이 μ•„λ‹Œ μ˜ˆμ‚°λ“€ 쀑 μ΅œλŒ“κ°’μΈ μ •μˆ˜λ₯Ό 초기 right κ°’μœΌλ‘œ μž‘μ•„μ€€λ‹€. 쑰건만 잘 μƒκ°ν•˜κ³  ν’€λ©΄ κ°„λ‹¨ν•˜κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 100001

int money[MAX];

int main(void) {
    int N, M;
    scanf("%d", &N);
    
    int maximum = 0;
    for(int i = 0; i < N; i++) {
        scanf("%d", &money[i]);
        if(maximum < money[i]) maximum = money[i];
    }

    scanf("%d", &M);

    int left = 0;
    int right = maximum;
    int result = 0;

    while(left <= right) {
        int mid = (left + right) / 2;
        int sum = 0;
        for(int i = 0; i < N; i++) {
            sum += (money[i] > mid ? mid : money[i]);
        }

        if(sum <= M) {
            left = mid + 1;
            result = (result > mid ? result : mid);
        }
        else
            right = mid - 1;
    }

    printf("%d\n", result);
    return 0;
}
Comments