题解
【提高】纪念品
1 条题解
-
0
#include <bits/stdc++.h> using namespace std; long long a[500000]; // 存储纪念品价格的数组 int main() { long long w,n,s=0,x=1,y; // w为每组价格上限,n为纪念品数量,s为分组数 cin >>w>> n; // 输入价格上限和纪念品数量 y=n; // y初始化为纪念品数组的最后一个元素索引 // 输入每个纪念品的价格 for (int i = 1; i <= n; i++) { cin>>a[i]; } // 对纪念品价格进行升序排序 sort(a + 1, a + n + 1); // 双指针法进行分组,x指向最小元素,y指向最大元素 while(x<=y){ // 如果当前最大的纪念品价格超过上限,单独一组 if(a[y]>w){ y--; } // 如果当前最小和最大的纪念品价格之和超过上限,最大的单独一组 else if(a[x]+a[y]>w){ s++; y--; } // 否则最小和最大的纪念品组成一组 else{ s++; x++; y--; } } cout<<s; // 输出最少分组数 return 0; }
- 1