C++且不使用vector头文件完成:元旦快到了校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡他要把购来的纪念品根据价格进行分组但每组最多只能包括两件纪念品并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品乐乐希望分组的数目最少。你的任务是写一个程序找出所有分组方案中分组数最少的一种输出最少的分组数目。输入描述输入文件
思路:
- 首先将纪念品的价格按照从小到大的顺序排序。
- 使用双指针法,一个指向价格最小的纪念品,一个指向价格最大的纪念品。
- 每次将最小和最大的纪念品价格相加,判断是否超过给定的上限w。
- 如果超过了上限,则将最大的纪念品价格单独分为一组,指针向前移动。
- 如果不超过上限,则将最小和最大的纪念品价格分为一组,指针都向前移动。
- 重复步骤3-5,直到指针相遇为止。
- 最终分组数目即为指针相遇之前的步数。
代码如下所示:
#include
int main() { int w, n; cin >> w >> n; int p[n]; for (int i = 0; i < n; i++) { cin >> p[i]; } sort(p, p + n); // 将纪念品价格排序 int left = 0, right = n - 1; int count = 0; // 分组数目 while (left <= right) { if (p[left] + p[right] > w) { // 如果价格之和超过上限 right--; // 最大价格的纪念品单独分为一组 count++; } else { // 价格之和不超过上限 left++; right--; count++; } } cout << count << endl; return 0;
原文地址: http://www.cveoy.top/t/topic/h7Z1 著作权归作者所有。请勿转载和采集!