ATM
18 August 2019
문제 : https://www.acmicpc.net/problem/11399
이번은 기다리는 시간의 합을 최소화하는 문제를 풀어보도록 하겠습니다.
#include<stdio.h>
static int* arr;
static int* sum;
void quickSort(int arr[], int low, int high);
int main(void) {
int N;
scanf("%d", &N);
arr = new int[N];
sum = new int[N];
for (int i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
quickSort(arr,0,N-1);
sum[0] = arr[0];
for (int i = 1; i < N; i++)
{
sum[i] = sum[i - 1] + arr[i];
}
int total = 0;
for (int i = 0; i < N; i++)
{
total += sum[i];
}
printf("%d", total);
return 0;
}
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high)
{
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++)
{
if (arr[j] <= pivot)
{
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
전체 기다리는 시간의 최소를 찾는 문제입니다.앞에 있는 사람이 기다리는 대기 시간이 뒤에 있는 사람 수 만큼 곱해서 영향을 미치므로 앞에 있는 사람의 대기시간을 최소로 줄이면 됩니다.
따라서 대기시간이 작은 순서대로 sort를 한후, 전체 대기시간을 계산하도록 합니다.