어흥

[백준 11964] Fruit Feast (C++) 본문

알고리즘/백준

[백준 11964] Fruit Feast (C++)

라이언납시오 2020. 12. 21. 17:40
728x90
반응형

문제 링크: www.acmicpc.net/problem/11964

 

11964번: Fruit Feast

Bessie has broken into Farmer John's house again! She has discovered a pile of lemons and a pile of oranges in the kitchen (effectively an unlimited number of each), and she is determined to eat as much as possible. Bessie has a maximum fullness of \(T\) (

www.acmicpc.net

1. 주의할 점

- 그리디로 접근하지 않도록 한다(예외를 잘 처리하면 가능할지도..?. Ex. 9 5 6)

 

2. 구현

- BFS를 통해 구현한다

- Check[] 배열을 모두 초기화하며, 해당 숫자에 도달할 수 있으면 True를 가진다

- Queue에는 현재 숫자와 물을 마셨는지에 대한 여부를 나타내는 변수를 담는다

- A와 B가 숫자가 같을 수 있으므로, 벡터를 통해 구분한다(같다면 중복연산을 더 하지 않도록)

- BFS를 통해 다음 숫자가 T보다 작고 방문한적이 없다면 방문 혹은 아직 물을 안마셨고, 현재 값의 반 + 벡터의 숫자(A or B)가 T보다 작고 방문한 적이 없다면 방문한다. 위의 2가지 중 1개를 만족할 경우, Result를 항상 갱신한다

 

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct info {
	int val;
	bool half;
};
info tmp;
bool check[5000001] = { false, };
vector<int> v;

int main() {
	int t, a, b, result;
	cin >> t >> a >> b;
	result = a;
	queue<info> q;
	tmp.half = false;
	tmp.val = a;
	check[a] = true;
	q.push(tmp);
	v.push_back(a);
	if (!check[b]) {
		tmp.val = b;
		check[b] = true;
		q.push(tmp);
		result = max(result, b);
		v.push_back(b);
	}

	while (!q.empty()) {
		int cv = q.front().val;
		bool ch = q.front().half;
		q.pop();
		for (int i = 0; i < v.size(); i++) {
			int nv = v[i] + cv;
			if (nv <= t && !check[nv]) {
				result = max(result, nv);
				check[nv] = true;
				tmp.half = ch;
				tmp.val = nv;
				q.push(tmp);
			}
			if (!ch) {
				nv = cv / 2 + v[i];
				if (nv <= t && !check[nv]) {
					result = max(result, nv);
					check[nv] = true;
					tmp.half = true;
					tmp.val = nv;
					q.push(tmp);
				}
			}
		}
	}
	cout << result;
	return 0;
}

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 14923] 미로 탈출 (C++)  (0) 2020.12.23
[백준 10159] 저울 (C++)  (0) 2020.12.21
[백준 14324] Rain (Small) (C++)  (0) 2020.12.09
[백준 9879] Cross Country Skiing (C++)  (0) 2020.12.08
[백준 2166] 다각형의 면적 (C++)  (2) 2020.12.05
Comments