1 条题解

  • 0
    @ 2026-2-2 14:22:38
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量:n为需要采购的牛奶总数量,m为提供牛奶的农民数量
    int n,m;
    // [2] 结构体定义:存储单个农民的牛奶信息,p为单价、a为可供应数量;arr数组存储所有农民的信息
    struct stu{
        int p,a;
    }arr[5100];
    
    // 自定义比较函数(主函数排序时调用,跳转注释)
    // [6] 排序规则:按牛奶单价p从小到大升序排列,是贪心策略的核心
    bool cmp(stu x,stu y){
        return x.p<y.p;
    }
    
    int main() {
        // [3] 输入核心参数:需要采购的牛奶总量n、提供牛奶的农民数量m
        cin>>n>>m;
        // [4] 循环遍历所有农民,依次输入单价和可供应数量,存入数组arr
        for(int i=1;i<=m;i++){
            cin>>arr[i].p>>arr[i].a;
        }
    
        // [5] 对农民信息按单价升序排序,调用自定义cmp比较函数
        sort(arr+1,arr+m+1,cmp);
    
        // [7] 初始化变量:i为农民遍历索引(从第一个开始),min_moey为最小采购总花费(初始0)
        int i=1,min_moey=0;
        // [8] 贪心采购核心循环:剩余采购量>0 且 还有未遍历的农民,继续采购
        while(0<n && i<=m){
            // [9] 判定:当前农民可供应量小于剩余采购量,全部采购该农民的牛奶
            if(n>arr[i].a){
                min_moey+=arr[i].p*arr[i].a; // 累加该农民全部牛奶的采购成本
                n-=arr[i].a; // 更新剩余需要采购的牛奶数量
            }else{
                // [10] 判定:当前农民可供应量足够剩余采购量,仅采购所需剩余数量
                min_moey+=arr[i].p*n; // 累加剩余数量牛奶的采购成本
                n=0; // 采购需求满足,置剩余量为0终止采购
            }
            i++; // 遍历索引后移,处理下一个农民
        }
        // [11] 输出最终计算的牛奶最小采购总花费
        cout<<min_moey;
        return 0;                  
    }
    
    • 1

    信息

    ID
    1043
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者