문제 링크

 

문제가 번역이 돼있지 않기 때문에 간략히 문제 설명을 써보겠습니다.

A역에서 B역까지 가는 승차정원이 n명인 열차가 있고, 기차표 예매 내역을 보고 어떻게 사람들을 골라 태워야 최대의 수익을 낼 수 있는지 구하는 문제입니다. 예매 내역은 1건당 출발지, 도착지, 인원수로 되어 있고, 한 예매내역을 취소시키든가, 전부 태우든가 해야합니다. 절반만 태우고 이렇게 하지 못합니다. 열차 요금은 이동거리 * 인원수 입니다.

 

예제 input의 첫 번째 test case입니다. 화살표에 적힌 숫자는 인원수고 밑에 적힌 숫자는 요금입니다.

이 경우 0->2, 1->2, 2->3 가는 손님들을 태울 때 요금의 합계가 19로 최대가 됩니다.

 

완전탐색으로 풀면 됩니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

using namespace std;


int from[22], to[22], people[22];
int station[8];
int max_earning, sum, orders;


void dfs(int current) {
	//마지막 역인 경우
	if (current == orders) {
		max_earning = max(max_earning, sum);
		return;
	}

	bool possible = true;

	//이번 order 예약 가능한지 체크
	for (int i = from[current]; i < to[current]; ++i) {
		if (station[i] < people[current]) {
			possible = false;
			break;
		}
	}

	//이번 order 포함
	if (possible) {
		//거치는 모든 역 좌석 수 감소
		for (int i = from[current]; i < to[current]; ++i)
			station[i] -= people[current];
		sum += people[current] * (to[current] - from[current]);
		
		dfs(current + 1);

		for (int i = from[current]; i < to[current]; ++i)
			station[i] += people[current];
		sum -= people[current] * (to[current] - from[current]);
	}

	dfs(current + 1);
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	int capacity, num_of_station;
	while (cin >> capacity >> num_of_station >> orders) {
		if (!capacity && !num_of_station && !orders) break;

		for (int i = 0; i < orders; ++i)
			cin >> from[i] >> to[i] >> people[i];

		for (int i=0; i<num_of_station; ++i)
			station[i] = capacity;

		max_earning = 0;
		sum = 0;

		dfs(0);

		cout << max_earning << '\n';
	}
	
	return 0;
}
반응형

'Online Judge > UVa' 카테고리의 다른 글

[UVa][C++] 524: Prime Ring Problem (소수 고리 문제)  (0) 2020.04.03