Algorithm/문제풀이

[그리디 알고리즘] ATM

lee308812 2019. 10. 30. 06:27

예제 입력 1

5

3 1 4 3 2

예제 출력 1

32

 

 

- 그리디 알고리즘으로 접근하고자 할 때는 반례를 찾고, 최적이 맞다고 생각되면 증명이 필요하다.

- 정답은 적게 걸리는 시간으로 정렬하여 푼다.

- 증명은 아래와 같다.

: t1 ~ t5는 1~5번 사람이 돈을 인출하는데 걸리는 시간이며, P1 ~ P5는 각 사람이 돈을 인출 완료하기까지 기다려야 하는 시간, 각 번호는 t가 작은 순으로 오름차순으로 정렬되어있다고 가정.

: P1 = p1

: P2 = p1 + p2

: P3 = p1 + p2 + p3

: ....

: P5 = p1 + ... + p5

 

Psum = 5*p1 + 4*p2 + ... + p5

 

따라서 p1이 작을수록 유리하다.

#include <stdio.h>

constexpr int MAX_COUNT = 1000;

int people[MAX_COUNT];
int N;

void swap(int data[], int a, int b)
{
	int temp = data[a];
	data[a] = data[b];
	data[b] = temp;
}

int partition(int data[], int start, int end)
{
	int index = start;

	for (int i = start; i < end; i++)
	{
		if (data[i] <= data[end])
		{
			swap(data, i, index);
			index++;
		}
	}

	swap(data, index, end);
	return index;
}

void qsort(int data[], int start, int end)
{
	if (start >= end) return;

	int pivot = partition(data, start, end);
	qsort(data, start, pivot - 1);
	qsort(data, pivot + 1, end);
}

int main(void)
{
	int result = 0;
	int waitTime = 0;

	scanf("%d", &N);

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

	qsort(people, 0, N - 1);

	for (int i = 0; i < N; i++)
	{
		result += (people[i] + waitTime);
		waitTime += people[i];
	}

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

	return 0;
}

 

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

[그리디 알고리즘] 전구와 스위치  (2) 2019.10.31
[그리디 알고리즘] 행렬  (0) 2019.10.31
[그리디 알고리즘] 회의실배정  (0) 2019.10.30
[그리디 알고리즘] 동전 0  (0) 2019.10.30
[BFS] 4연산  (0) 2019.10.30