알고리즘/SW Expert Academy

[D5] 7730. 나무 깎는 홍준

혬혬 2019. 10. 6. 11:02
728x90
#include <stdio.h>
int tree[1000000];
int tree_amount = 0;
int want_to_tree_amount = 0;
int available(int mid) {
	long long buffer = 0;
	for (int i =tree_amount-1; i >0; i--) {
		if (tree[i] > mid) {
			buffer += tree[i] - mid;
		}
		if (tree[i] < mid)
			break;
	}	
	if (buffer >= want_to_tree_amount)
		return 1;
	return 0;
}
void quickSort(int first, int last)
{
	int pivot;
	int i;
	int j;
	int temp;

	if (first < last)
	{
		pivot = first;
		i = first;
		j = last;

		while (i < j)
		{
			while (tree[i] <= tree[pivot] && i < last)
			{
				i++;
			}
			while (tree[j] > tree[pivot])
			{
				j--;
			}
			if (i < j)
			{
				temp = tree[i];
				tree[i] = tree[j];
			tree[j] = temp;
			}
		}

		temp = tree[pivot];
		tree[pivot] = tree[j];
		tree[j] = temp;

		quickSort(first, j - 1);
		quickSort(j + 1, last);
	}
}
int main() {
	int test_case = 0;
	scanf("%d",&test_case);
	for (int q = 0; q < test_case; q++) {
		
		scanf("%d %d", &tree_amount, &want_to_tree_amount);
		int max = 0;
		for (int i = 0; i < tree_amount; i++) {
			scanf("%d", &tree[i]);
			if (tree[i] > max)
				max = tree[i];
		}
		quickSort(0, tree_amount - 1);
		int cut_point = 0;
		int low = 1;
		int mid =0;
		int result = 0;
		while (low<=max) {
			mid = (max + low) / 2;
			if (available(mid)) {
				if (mid > result)
					result = mid;
				low = mid+1;
			}
			else {
				max = mid-1;
			}
		
		}
		printf("#%d %d\n", q + 1, result);
	}

	return 0; 
}
728x90