Algorithm/문제풀이

[Brute Force] 캠프 준비

lee308812 2020. 3. 5. 20:32

예제 입력 1

3 5 6 1

1 2 3

예제 출력 1

2

2번, 3번 문제를 고르는 방법, 모든 문제를 고르는 방법이 가능하다.

예제 입력 2

4 40 50 10

10 20 30 25

예제 출력 2

2

난이도가 10, 30인 문제를 고르거나, 20, 30인 문제를 고르면 된다.

예제 입력 3

5 25 35 10

10 10 20 10 20

예제 출력 3

6

 

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

 

16938번: 캠프 준비

난이도가 10, 30인 문제를 고르거나, 20, 30인 문제를 고르면 된다.

www.acmicpc.net

 

- N 제한이 15이므로, 15개 중 2개 이상의 수를 뽑아서 해당 조건에 만족하는지 체크하고 만족하면 결과+1하도록 구현하였다.

[ 결과(C++17) ]

#include <stdio.h>

constexpr int MAX_COUNT = 15;

int N, L, R, X;
int problems[MAX_COUNT];
bool selected[MAX_COUNT];

int result = 0;

inline int MIN(int a, int b) { return a > b ? b : a; }
inline int MAX(int a, int b) { return a > b ? a : b; }

void go(int start, int cnt)
{
	if (cnt > 1)
	{
		int minHard = 21'0000'0000;
		int maxHard = -21'0000'0000;
		long long hardSum = 0;

		for (int i = 0; i < N; i++)
		{
			if (selected[i])
			{
				hardSum += problems[i];
				minHard = MIN(minHard, problems[i]);
				maxHard = MAX(maxHard, problems[i]);
			}
		}

		if (hardSum >= L && hardSum <= R && (maxHard - minHard) >= X)
		{
			result++;
		}

		if (cnt == N) return;
	}

	for (int i = start; i < N; i++)
	{
		if (selected[i]) continue;

		selected[i] = true;
		go(i + 1, cnt + 1);
		selected[i] = false;
	}
}



int main(void)
{
	scanf("%d %d %d %d", &N, &L, &R, &X);

	for (int i = 0; i < N; i++)
	{
		scanf("%d", &problems[i]);
	}

	go(0, 0);

	printf("%d\n", result);

	return 0;
}

 

 

 

'Algorithm > 문제풀이' 카테고리의 다른 글

[Leetcode] Squares of a Sorted Array  (0) 2021.06.26
괄호  (0) 2021.02.19
[Brute Force] 두 스티커  (0) 2020.03.04
[Brute Force] 나3곱2  (0) 2020.03.04
[Brute Force] 십자가 찾기  (0) 2020.02.08