top1编程
← 返回题目
题解

【提高】纪念品

1 条题解

  • 0
    @ 2026-7-29 0:18:20
    #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