今年是校庆60周年,学校少先队大队部举行了庆祝活动,其中有一项活动是摘彩球。大队辅导员在学校礼堂里高低不一地挂了N个彩球,请M位少先队员到礼堂里摘彩球。辅导员说:你们每人最多可以摘两个彩球,而且只许站着伸手摘,不允许借助其它工具,摘下的彩球归大家共有。由于各少先队员的身高参差不齐,怎样才能使他们摘的彩球总数最多呢?请你计算少先队员们最多能摘到多少个彩球?(不能使用sort)
时间: 2024-03-30 18:38:46 浏览: 147
如果不能使用 `sort` 函数,我们可以使用类似快速排序的方法来对彩球进行排序,然后再按照上面的贪心策略进行分配。具体实现如下:
```c++
#include <iostream>
using namespace std;
const int MAXN = 1005;
int a[MAXN];
void quick_sort(int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = a[(l + r) / 2];
while (i < j) {
do i++; while (a[i] < x);
do j--; while (a[j] > x);
if (i < j) swap(a[i], a[j]);
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
quick_sort(0, n - 1);
int ans = 0;
for (int i = 0; i < n; i++) {
if (m == 0) break;
if (a[i] <= m) {
ans++;
m -= a[i];
}
else if (i > 0 && a[i] <= m + a[i - 1]) {
ans++;
m -= a[i] - a[i - 1];
}
}
cout << ans << endl;
return 0;
}
```
在代码中,我们首先输入了 n 和 m,即彩球的数量和少先队员的数量。然后输入每个彩球的高度,并使用 `quick_sort` 函数对彩球进行排序。接下来,我们依次遍历每个彩球,对于每个少先队员,如果他有足够的身高去摘这个彩球,那么就将他摘下来,并更新剩余可摘的身高;否则,如果他的身高不足以摘这个彩球,但是可以摘下比这个彩球低的彩球,那么就摘下一个比当前彩球低的彩球,并更新剩余可摘的身高。最后统计少先队员总共摘到的彩球数量即可。
需要注意的一点是,当当前少先队员无法摘下当前彩球时,我们需要判断他是否可以摘下比当前彩球低的彩球,这里需要特别注意边界条件。此外,为了防止快速排序算法出现最坏情况,我们可以使用随机化的方法来选择枢轴元素,这里为了简单起见,我们直接选取中间位置的元素作为枢轴。
阅读全文