洛谷P2676-Bookshelf
题目描述
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。
所有N(1 <= N <= 20,000)头奶牛都有一个确定的身高H_i(1 <= H_i <= 10,000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1 <= B <= S < 2,000,000,007。
为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。
显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。
输入格式
- 第1行: 2个用空格隔开的整数:N 和 B * 第2..N+1行: 第i+1行是1个整数:H_i
输出格式
- 第1行: 输出1个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部
输入输出样例
6 40 6 18 11 13 19 11
3
说明/提示
输入说明:
一共有6头奶牛,书架的高度为40,奶牛们的身高在6..19之间。
输出说明:
一种只用3头奶牛就达到高度40的方法:18+11+13。当然还有其他方法,在此不一一列出了。
题解
冒泡排序
最初的想法是利用贪心思想从最大的开始选起,利用最简单的冒泡排序对输入序列进行排序。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int cow_num = 20000;
int cow[cow_num];
int N, B;
int main() {
int i,j,temp,result=0;
scanf("%d%d", &N, &B);
for (i = 0;i < N;i++) {
scanf("%d", &cow[i]);
}
for (i = 0;i < N;i++) {
for (j = i + 1;j < N;j++) {
if (cow[i] < cow[j]) {
temp = cow[i];
cow[i] = cow[j];
cow[j] = temp;
}
}
}
for (i = 0;result < B && i <= N;i++) {
result = result + cow[i];
}
printf("%d\n", i);
}
堆排序
看到有题解说用堆,因为没学过,所以借鉴学习一下。同时借鉴b站up主:正月点灯笼。(这个up主太厉害了!讲的内容非常好)感觉今晚还没看懂,先睡觉了,明天会更好!
#include<cstdio>
#include<iostream>
using namespace std;
const int num = 20000;
void swap(int tree[], int i, int j) {
int temp = tree[i];
tree[i] = tree[j];
tree[j] = temp;
}
void heapify(int tree[], int n, int i) {
if (i >= n) {
return;
}
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if (c1 < n &&tree[c1] > tree[max]) {
max = c1;
}
if (c2 < n &&tree[c2] > tree[max]) {
max = c2;
}
if (max != i) {
swap(tree, max, i);
heapify(tree, n, max);
}
}
void build_heap(int tree[], int n) {
int last_node = n - 1;
int parent = (last_node - 1) / 2;
int i;
for (i = parent;i >= 0;i--) {
heapify(tree, n, i);
}
}
void heap_sort(int tree[], int n) {
build_heap(tree, n);
int i;
for (i = n - 1;i >= 0;i--) {
swap(tree, i, 0);
heapify(tree, i, 0);
}
}
int main() {
int N, B,i,sum=0,count=0;
int cow[num];
scanf("%d%d", &N, &B);
for ( i = 0;i < N;i++) {
scanf("%d", &cow[i]);
}
heap_sort(cow, N);
for ( i = N-1;sum < B && i >= 0;i--) {
sum = sum + cow[i];
count++;
}
printf("%d\n", count);
return 0;
}
浙公网安备 33010602011771号