侧边栏壁纸
  • 累计撰写 192 篇文章
  • 累计创建 2 个标签
  • 累计收到 87 条评论

【题解】【上海】【工作安排】

Allen Best
2023-08-09 / 6 评论 / 9 点赞 / 38,096 阅读 / 642 字
温馨提示:
本文最后更新于 2023-08-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

如果只有两个任务,那么假设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;
}
0

评论区