무민은귀여워

[알고스팟] 울타리 잘라내기 FENCE 본문

IT/알고리즘

[알고스팟] 울타리 잘라내기 FENCE

moomini 2019. 11. 19. 17:41
반응형

https://algospot.com/judge/problem/read/FENCE

 

algospot.com :: FENCE

울타리 잘라내기 문제 정보 문제 너비가 같은 N개의 나무 판자를 붙여 세운 울타리가 있습니다. 시간이 지남에 따라 판자들이 부러지거나 망가져 높이가 다 달라진 관계로 울타리를 통째로 교체하기로 했습니다. 이 때 버리는 울타리의 일부를 직사각형으로 잘라내 재활용하고 싶습니다. 그림 (b)는 (a)의 울타리에서 잘라낼 수 있는 많은 직사각형 중 가장 넓은 직사각형을 보여줍니다. 울타리를 구성하는 각 판자의 높이가 주어질 때, 잘라낼 수 있는 직사각형의 최대

algospot.com

 

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
// 책 코드.
 
int N;
vector<int> h;
 
int solve(int left, int right)
{
    if (left == right)
        return h[left];
 
    int mid = (left + right) / 2;
 
    int ret = max(solve(left, mid), solve(mid + 1, right));
 
    int lo = mid;
    int hi = mid + 1;
    int height = min(h[lo], h[hi]);
 
    ret = max(ret, height * 2);
 
    while (left < lo || hi < right)
    {
        if (hi < right && (lo == left || h[lo - 1< h[hi + 1]))
        {
            ++hi;
            height = min(height, h[hi]);
        }
 
        else
        {
            --lo;
            height = min(height, h[lo]);
        }
 
        ret = max(ret, height * (hi - lo + 1));
    }
 
    return ret;
 
}
 
int main()
{
    int count;
    cin >> count;
    while (count--)
    {
        h.clear();
 
        cin >> N;
 
        for (int i = 0; i < N; i++) {
            int temp;
            cin >> temp;
            h.push_back(temp);
        }
 
        cout << solve(0, N - 1<< endl;
 
    }
 
    return 0;
 
}
cs
반응형
Comments