0
点赞
收藏
分享

微信扫一扫

P2676 [USACO07DEC]Bookshelf B

酷子腿长一米八 2022-01-24 阅读 75
算法

 

 

 

这道题思路是先将奶牛身高存在数组中,然后对数组进行排序,接着找最大的,次大的相加,直到加到大于书架高度B,此时输出相加次数;

/*嗯···这奶牛能够堆起来是超出我的想象了,我本来还以为是要用hanoi的算法呢,但是在读读题发现就是简单的垒起来*/

我利用的是随机快排进行排序,随机快排在快排的基础上添加了对基准值的随机获取;

该题其实利用STL中的sort一键排序是会大大减少代码量的;

手写快排是为了让我们这些对基础排序不熟悉的小白更好的了解代码 ;

 整体代码如下:

#include<iostream>
using namespace std;
int cow[20005];
void quickSort_rand(int a[], int left, int right)//随机基准值快排
{
	if (left >= right)
	{
		return;
	}
	int i = left, j = right, pivot = rand() % (right - left + 1) + left;//获取随机基准值
	swap(a[left], a[pivot]);
	while (i < j)
	{
		while (j > i && a[j] <= a[left])
		{
			j--;
		}
		while (i < j && a[i] >= a[left])
		{
			i++;
		}
		swap(a[i], (i == j) ? a[left] : a[j]);
	}
		quickSort_rand(a, left, i);
		quickSort_rand(a, i + 1, right);
}
int main()
{
	
	int N,B;
	int sum = 0;
	int count = 0;
	
	cin >> N>>B;
	for (int i = 0; i < N; i++)//输入奶牛
	{
		cin >> cow[i];
	}
	quickSort_rand(cow, 0, N - 1);
	while (sum < B)
	{
		sum = sum + cow[count];
		count++;
	}
	printf("%d", count);
}
举报

相关推荐

0 条评论