기술 블로그

16938번 캠프 준비 본문

알고리즘 문제/BOJ

16938번 캠프 준비

parkit 2019. 4. 14. 13:10
728x90
반응형

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




기본적인 백트래킹 문제이다.



첫 번째 코드는 내가 직접 푼 코드이고,

두 번째 코드는 정답자 분들 중 짧기도 하고, 깨끗하게 푸신 분이 계셔서

그 분의 코드를 참고하여 다시 구현해본 것이다.






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
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
#include <set>
#include <sstream>
#include <tuple>
 
#pragma warning(disable:4996)  
#pragma comment(linker, "/STACK:336777216")
 
using namespace std;
 
int N = 0, L = 0, R = 0, X = 0, ans = 0;
 
int test_var = 0;
 
vector<int> v;
 
bool use[16= { false, };
 
bool check(vector<int> vc)
{
    int sum = 0;
 
    for (auto i : vc) sum += i;
 
    int big = *max_element(vc.begin(), vc.end());
    int small = *min_element(vc.begin(), vc.end());
 
    if (sum < L || sum > R || abs(big - small) < X) return false;
 
    return true;
}
 
void simulation(vector<int> vc, int pos)
{
    if (vc.size() >= 2 && check(vc)) ++ans;
    
    if (pos >= v.size()) return;
 
    for (int i = pos; i < v.size(); i++)
        if (!use[i])
        {
            use[i] = true;
            vc.push_back(v.at(i));
 
            simulation(vc, i);
 
            use[i] = false;
            vc.pop_back();
        }
}
 
int main(void)
{
    int score = 0;
 
    scanf("%d %d %d %d"&N, &L, &R, &X);
 
    for (int i = 0; i < N; i++)
    {
        scanf("%d"&score);
 
        v.push_back(score);
    }
 
    vector<int> vc;
 
    simulation(vc, 0);
 
    printf("%d\n", ans);
 
    return 0;
}
cs










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
70
71
#include <iostream>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
#include <set>
#include <sstream>
#include <tuple>
 
#pragma warning(disable:4996)  
#pragma comment(linker, "/STACK:336777216")
 
using namespace std;
 
int N = 0, L = 0, R = 0, X = 0, ans = 0;
 
vector<int> v;
 
bool use[16= { false, };
 
int simulation(int pos)
{
    if (pos >= N)
    {
        int MAX = -1, MIN = 1e9, sum = 0;
 
        for (int i = 0; i < N; i++)
            if (use[i])
            {
                sum += v.at(i);
 
                MAX = max(MAX, v.at(i));
                MIN = min(MIN, v.at(i));
            }
 
        return L <= sum && sum <= R && MAX - MIN >= X;
    }
 
    int ret = 0;
 
    use[pos] = true;
 
    ret = simulation(pos + 1);
 
    use[pos] = false;
 
    return ret + simulation(pos + 1);
}
 
int main(void)
{
    int score = 0;
 
    scanf("%d %d %d %d"&N, &L, &R, &X);
 
    for (int i = 0; i < N; i++)
    {
        scanf("%d"&score);
 
        v.push_back(score);
    }
 
    printf("%d\n", simulation(0));
 
    return 0;
}
cs













728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

17141번 연구소 2  (0) 2019.04.15
2744번 대소문자 바꾸기  (0) 2019.04.14
16937번 두 스티커  (0) 2019.04.14
16939번 2×2×2 큐브  (0) 2019.04.12
17130번 토끼가 정보섬에 올라온 이유  (0) 2019.04.11