1 条题解
-
0
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
- 上传者