1 条题解

  • 0
    @ 2026-9-30 12:58:25

    C++ :

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    /*
      买饲料:车上有 X 份食物时每走一里花 X 元。
      在位置 x 的商店买一份食物,价格 c;这一份要被带到终点 E,
      它在车上多走了 E-x 里,所以多花的钱正好是 E-x 元。
      于是每家商店的「实际单价」= c + (E - x),与其他份数无关。
      买 K 份的最小花费 = 取所有(商店,每份)中最便宜的 K 份之和:
      把商店按实际单价升序排序,依次尽量买满即可。
      样例 K=2 E=5 N=3:店(3,1份,2元) 单价 2+2=4;(4,1份,2元) 单价 2+1=3;(1,1份,1元) 单价 1+4=5。
      最便宜的两份 3+4 = 7。
    */
    static long long x[105], f[105], c[105], s[105];
    int main(){
        long long K, E, N;
        if(scanf("%lld %lld %lld", &K, &E, &N) != 3) return 0;
        for(long long i = 1; i <= N; i++){
            scanf("%lld %lld %lld", &x[i], &f[i], &c[i]);
            s[i] = E - x[i] + c[i];              /* 实际单价 */
        }
        for(long long i = 1; i < N; i++)
            for(long long j = i + 1; j <= N; j++)
                if(s[i] > s[j]){ swap(s[i], s[j]); swap(f[i], f[j]); }
        long long cost = 0;
        for(long long i = 1; i <= N && K > 0; i++){
            long long take = (K >= f[i]) ? f[i] : K;
            cost += take * s[i];
            K -= take;
        }
        printf("%lld\n", cost);
        return 0;
    }
    
    
    • 1

    信息

    ID
    2844
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者