[풀이]백준 풀이(VIII/16936 등 )

문제풀이

[RE]캠프준비(16938, 구현)

  • 2<=N<=15, N=문제의 개수
  • L<=난이도의합<=R, 최고난이도 - 최저난이도 >= X
  • 최악의 경우의 수 = 2^N = O(2^N)
  • 어려운 것: 최고난이도, 최저난이도 (무엇을 선택하는지에 따라 계속 변경됨)

풀이1과 2는 조삼모사

풀이1. 구현 후 필요한 조건만을 나열해서 전체 확인

풀이2. 선택과 동시에 모든 것을 처리함(재귀형태, 인자가 많다)

회고

나는 재귀를 더럽게못짠다…. 심지어 INPUT을 순서를 다르게받아서 계속 헛짓을 했다.

재귀가 아닌형태로 다시 짜서 제출하자


#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>

#define MAX 1000000
using namespace std;

int n, l, x, r;
int A[15];
int Answer=0;
bool choice[15];

int go(int index, int cnt, int sum, int easy, int hard){

	if(index==n)
	{
		if(cnt >= 2 && l <= sum && sum <= r && hard-easy >= x )	return 1;
		else return 0;
	}
	//선택O
	int cnt1= go(index+1, cnt+1, sum+A[index], min(easy,A[index]), max(hard,A[index]));
	//선택X
	int cnt2 = go(index+1, cnt, sum, easy, hard);
	return cnt1+cnt2;
}

int main(){
	//N=문제 수,
	//L<= SUM(문제난이도) <=R
	//R-L>=X
	//1<=N   <=15
	//1<=L<=R<=1,000,000,000
	//1<=X   <=1,000,000
	//1<=A[i]<=1,000,000
	cin >> n >> l >> r >> x;
	for(int i=0; i<n; i++){
		cin >> A[i];
	}
	cout << go(0,0,0, MAX, 0);
}

댓글남기기