λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #2512 μ˜ˆμ‚°

by dar0m! 2020. 5. 11.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
 1 초 128 MB 31.285%

 

 

2512번: μ˜ˆμ‚°

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

www.acmicpc.net

 

문제

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

  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 μ΄ν•˜μ΄λ‹€. 

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

 

ν•΄κ²°

key point,이뢄탐색
  • 이뢄탐색을 ν•˜κΈ° μœ„ν•΄μ„œ λ°˜λ“œμ‹œ 정렬을 ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.
  • 0~end or 1~end+1 λ²”μœ„μ—μ„œ 탐색해야 ν•œλ‹€.

μ—¬λŸ¬λ²ˆ ν‹€λ ΈλŠ”λ° κ·Έ μ΄μœ λŠ” 8번째 쀄을 if( l >= r) return; λ•Œλ¬Έμ΄μ—ˆλ‹€.

3 
3 2 4 
5

이 κ²½μš°μ— 닡은 1이 좜λ ₯λ˜μ–΄μ•Όλ˜λŠ”λ° 0이 좜λ ₯λ˜μ—ˆλ‹€. mid값이 1이 되렀면 l, r λͺ¨λ‘κ°€ 1μ΄μ–΄μ•Όν•˜λŠ”λ° κ·Έ λ•Œ '='μ—°μ‚°μž λ•Œλ¬Έμ— κ±Έλ €μ„œ λ¦¬ν„΄λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ΅œλŒ€ midκ°€ 0μ΄μ—ˆλ˜ 것이닀.

μ½”λ“œ

λ©”λͺ¨λ¦¬ μ‹œκ°„
2024 KB  0ms
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
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;
typedef long long ll;
int n, budget, arr[10005], ans;
void go(int l, int r) {
    if (l > r) return;
    int mid = (l + r) / 2;
    ll sum = 0;
    for (int i = 0; i < n; i++) {
        if (mid >= arr[i]) {
            sum += arr[i];
        }
        else sum += mid;
    }
    if (budget >= sum) {
        ans = mid;
        go(mid + 1, r);
    }
    else {
        go(l, mid - 1);
    }
}
int main(){
    scanf("%d"&n);
    ll sum = 0;
    for (int i = 0; i < n; i++) {
        scanf("%d"&arr[i]);
        sum += arr[i];
    }
    scanf("%d"&budget);
    sort(arr, arr + n);
    if (sum <= budget) {
        printf("%d", arr[n - 1]);
        return 0;
    }
    go(0, arr[n - 1]);
    printf("%d", ans);
    return 0;
}
cs

 

ν›„κΈ°

μ•Œκ³  μžˆλ‹€κ³  μƒκ°ν–ˆλ˜ μ΄λΆ„νƒμƒ‰μ—μ„œ 많이 ν‹€λ¦¬κ²Œ λ˜μ–΄ 정말 λ‹Ήν™©ν–ˆμ—ˆλ‹€. μ•ˆκΉŒλ¨ΉκΈΈ!

'πŸ”₯ PS(Problem Solving) πŸ”₯ > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] #5397 ν‚€λ‘œκ±°  (0) 2020.05.21
[BOJ] #1912 연속합  (0) 2020.05.11
[BOJ] #13414 μˆ˜κ°•μ‹ μ²­  (0) 2020.05.02
[BOJ] #1748 수 이어 μ“°κΈ° 1  (0) 2020.04.23
[BOJ] #1953 νŒ€λ°°λΆ„  (0) 2020.04.21

λŒ“κΈ€