如果只有两个任务,那么假设a任务为ta,fa,b任务为tb,fb,那么如果先做a任务则总罚金为ta*fa+(ta+tb)*fb,先做b任务为tb*fb+(ta+tb)*fa。
把两个算式展开a的总罚金为ta*fa+ta*fb+tb*fb
b的总罚金为ta*fa+tb*fa+tb*fb去掉相同的项目,发现罚金数量跟ta*fb和tb*fa的大小相关,即如果ta*fb<tb*fa 则应该先做a任务。
#include <bits/stdc++.h>
using namespace std;
struct node {//保存任务数据
int t;//时长
int f;//罚金
} a[200005];
bool cmp(node x, node y) {//按xt*yf和yt*xf排序
return x.t * y.f < y.t * x.f;
}
int n;
long long ans = 0;//总罚金
long long sumt = 0;//累计时长
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d %d", &a[i].t, &a[i].f);
}
sort(a + 1, a + n + 1, cmp);//排序
for (int i = 1; i <= n; i++) {
sumt += a[i].t;//累计时长
ans += sumt * a[i].f;//计算罚金
}
printf("%lld", ans);
return 0;
}
评论区