XXX2024073105:纪念品分组【c++】
描述
【题目描述】
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目
输入描述
【输入描述】
输入共 n+2 行:
第 1 行,包括一个整数 w,为每组纪念品价格之和的上限;
第 2 行,为一个整数 n,表示购来的纪念品的总件数;
接下来 n 行,每行一个正整数 Pi 表示所对应纪念品的价格。
输出描述
【输出格式】
输出共1行:
一个整数,即最少的分组数目。
用例输入 1
100 990 20 20 30 50 60 70 80 90
用例输出 1
6
AC CODE
#include <iostream>
#include <vector>
#include <algorithm> using namespace std; int main() { int w; int n; cin >> w >> n; vector<int> prices; for (int i = 0; i < n; ++i) { int p; cin >> p; prices.push_back(p); } // 将物品按价格从小到大排序 sort(prices.begin(), prices.end()); int i = 0; int j = n - 1; int count = 0; while (i <= j) { if (i == j) { // 剩下一个物品,单独成组 count++; i++; } else { if (prices[i] + prices[j] <= w) { // 可以配对 count++; i++; j--; } else { // 不可以配对,只能单独放最大的物品 count++; j--; } } } cout << count ; return 0;
}