πŸ•οΈ ICPC Sinchon/Simulation

[BOJ S2][C++] λ°±μ€€ 18111번: λ§ˆμΈν¬λž˜ν”„νŠΈ

선달 2022. 11. 17. 19:12
λ°˜μ‘ν˜•

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

 

18111번: λ§ˆμΈν¬λž˜ν”„νŠΈ

νŒ€ λ ˆλ“œμ‹œν”„νŠΈλŠ” λŒ€νšŒ μ€€λΉ„λ₯Ό ν•˜λ‹€κ°€ μ§€λ£¨ν•΄μ Έμ„œ μƒŒλ“œλ°•μŠ€ κ²Œμž„μΈ ‘λ§ˆμΈν¬λž˜ν”„νŠΈ’λ₯Ό μΌ°λ‹€. λ§ˆμΈν¬λž˜ν”„νŠΈλŠ” 1 × 1 × 1(μ„Έλ‘œ, κ°€λ‘œ, 높이) 크기의 λΈ”λ‘λ“€λ‘œ 이루어진 3차원 μ„Έκ³„μ—μ„œ 자유둭게

www.acmicpc.net

 

문제

νŒ€ λ ˆλ“œμ‹œν”„νŠΈλŠ” λŒ€νšŒ μ€€λΉ„λ₯Ό ν•˜λ‹€κ°€ μ§€λ£¨ν•΄μ Έμ„œ μƒŒλ“œλ°•μŠ€ κ²Œμž„μΈ ‘λ§ˆμΈν¬λž˜ν”„νŠΈ’λ₯Ό μΌ°λ‹€. λ§ˆμΈν¬λž˜ν”„νŠΈλŠ” 1 × 1 × 1(μ„Έλ‘œ, κ°€λ‘œ, 높이) 크기의 λΈ”λ‘λ“€λ‘œ 이루어진 3차원 μ„Έκ³„μ—μ„œ 자유둭게 땅을 νŒŒκ±°λ‚˜ 집을 지을 수 μžˆλŠ” κ²Œμž„μ΄λ‹€.

λͺ©μž¬λ₯Ό μΆ©λΆ„νžˆ λͺ¨μ€ lvalueλŠ” 집을 μ§“κΈ°λ‘œ ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ κ³ λ₯΄μ§€ μ•Šμ€ λ•…μ—λŠ” 집을 지을 수 μ—†κΈ° λ•Œλ¬Έμ— λ•…μ˜ 높이λ₯Ό λͺ¨λ‘ λ™μΌν•˜κ²Œ λ§Œλ“œλŠ” ‘λ•… κ³ λ₯΄κΈ°’ μž‘업을 ν•΄μ•Ό ν•œλ‹€.

lvalueλŠ” μ„Έλ‘œ N, κ°€λ‘œ M ν¬κΈ°μ˜ 집터λ₯Ό κ³¨λžλ‹€. 집터 맨 μ™Όμͺ½ μœ„μ˜ μ’Œν‘œλŠ” (0, 0)이닀. 우리의 λͺ©μ μ€ 이 집터 λ‚΄μ˜ λ•…μ˜ 높이λ₯Ό μΌμ •ν•˜κ²Œ λ°”κΎΈλŠ” 것이닀. μš°λ¦¬λŠ” λ‹€μŒκ³Ό 같은 두 μ’…λ₯˜μ˜ μž‘μ—…μ„ ν•  수 μžˆλ‹€.

  1. μ’Œν‘œ (i, j)의 κ°€μž₯ μœ„μ— μžˆλŠ” 블둝을 μ œκ±°ν•˜μ—¬ 인벀토리에 λ„£λŠ”λ‹€.
  2. μΈλ²€ν† λ¦¬μ—μ„œ 블둝 ν•˜λ‚˜λ₯Ό κΊΌλ‚΄μ–΄ μ’Œν‘œ (i, j)의 κ°€μž₯ μœ„μ— μžˆλŠ” 블둝 μœ„μ— λ†“λŠ”λ‹€.

1번 μž‘μ—…μ€ 2μ΄ˆκ°€ 걸리며, 2번 μž‘μ—…μ€ 1μ΄ˆκ°€ κ±Έλ¦°λ‹€. λ°€μ—λŠ” λ¬΄μ„œμš΄ λͺ¬μŠ€ν„°λ“€μ΄ λ‚˜μ˜€κΈ° λ•Œλ¬Έμ— μ΅œλŒ€ν•œ 빨리 λ•… κ³ λ₯΄κΈ° μž‘μ—…μ„ λ§ˆμ³μ•Ό ν•œλ‹€. ‘λ•… κ³ λ₯΄κΈ°’ μž‘업에 κ±Έλ¦¬λŠ” μ΅œμ†Œ μ‹œκ°„κ³Ό κ·Έ 경우 λ•…μ˜ 높이λ₯Ό 좜λ ₯ν•˜μ‹œμ˜€.

단, 집터 μ•„λž˜μ— 동꡴ λ“± 빈 곡간은 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©°, 집터 λ°”κΉ₯μ—μ„œ 블둝을 κ°€μ Έμ˜¬ 수 μ—†λ‹€. λ˜ν•œ, μž‘μ—…μ„ μ‹œμž‘ν•  λ•Œ μΈλ²€ν† λ¦¬μ—λŠ” B개의 블둝이 λ“€μ–΄ μžˆλ‹€. λ•…μ˜ λ†’μ΄λŠ” 256블둝을 μ΄ˆκ³Όν•  수 μ—†μœΌλ©°, μŒμˆ˜κ°€ 될 수 μ—†λ‹€.

μž…λ ₯

첫째 쀄에 N, M, Bκ°€ 주어진닀. (1 ≤ M, N ≤ 500, 0 ≤ B ≤ 6.4 × 107)

λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 각각 M개의 μ •μˆ˜λ‘œ λ•…μ˜ 높이가 주어진닀. (i + 2)번째 μ€„μ˜ (j + 1)번째 μˆ˜λŠ” μ’Œν‘œ (i, j)μ—μ„œμ˜ λ•…μ˜ 높이λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. λ•…μ˜ λ†’μ΄λŠ” 256보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0이닀.

좜λ ₯

첫째 쀄에 땅을 κ³ λ₯΄λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„κ³Ό λ•…μ˜ 높이λ₯Ό 좜λ ₯ν•˜μ‹œμ˜€. 닡이 μ—¬λŸ¬ 개 μžˆλ‹€λ©΄ κ·Έμ€‘μ—μ„œ λ•…μ˜ 높이가 κ°€μž₯ 높은 것을 좜λ ₯ν•˜μ‹œμ˜€.

 

풀이

λͺ¨λ“  경우의 수λ₯Ό λ‹€ λŒμ•„λ„ μˆ˜κ°€ 그리 크지 μ•ŠμœΌλ―€λ‘œ 브루트포슀 λͺ¨λ“  λ†’μ΄μ˜ 경우λ₯Ό 쑰사해본닀

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int,int> ci;

const int INF = 150000000; // 500*500*256*2 = 128000000

ci solution(int n, int m, int b, vector<vector<int>>&land) {
    ci ans = {INF, 0}; // λ‹΅ 쌍 = { κ±Έλ¦¬λŠ” μ΅œμ†Œμ‹œκ°„, λ•… 높이 }
    
    for(int height=0; height<=256; height++) {
        int inventory=b, required_time=0;
        
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                
                int diff = land[i][j] - height;
                if(diff>0) {
                    // μ–‘μˆ˜μΌκ²½μš°: λΈ”λŸ­μ„ μ œκ±°ν•˜μ—¬ 인벀토리에 λ„£λŠ”λ‹€ (2초)
                    required_time += 2*diff;
                } else {
                    // 음수일경우: λΈ”λŸ­μ„ κΊΌλ‚΄μ„œ μœ„μ— λ†“λŠ”λ‹€ (1초)
                    required_time += 1*-diff;
                }
                inventory += diff;
            }
        }
        
        if(inventory>=0 && ans.first>=required_time) {
            ans = {required_time, height};
        }
    }
    
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int n, m, b;
    cin >> n >> m >> b;
    vector<vector<int>> land (n, vector<int>(m,0));
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin >> land[i][j];
    
    ci ans = solution(n, m, b, land);
    
    cout << ans.first << " " << ans.second;
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•