ADV-1181 搬运冰块(贪心)

问题描述

  丑枫接到了一份奇葩的工作:往冰库里搬运冰块.冰库外放着N箱冰块,由于室外温度高,冰块会很快融化,且每箱冰块的融化速度不同.因为每箱冰块的体积,质量不等,把每箱冰块搬运进冰块花费的时间也不同.因此需要合理安排搬运顺序,才能使总的冰块融化量最小.丑枫请你帮忙计算最少的总融化量是多少,以便汇报上司.

输入格式

  第一行输入整数N
  接下来N行,每行两个整数,分别表示每箱冰块的搬运耗时Ti及融化速度Di.

输出格式

  输出最少的总融化量

思路

结论:应该按照di*ti+1 > di+1*ti的顺序排列冰块,融化的量才最小
证明:设第i个冰块搬运耗时ti,融化速度di, 第i+1个冰块搬运耗时ti+1,融化速度di+1
那么,将这两个冰块交换搬运顺序,考虑交换后融化的量为多少。
显然,交换这两个冰块不会影响其他冰块的融化量
image

#include <iostream>
#include <cstring>
#include <algorithm>

#define x first
#define y second

using namespace std;

const int N = 1000010;
typedef long long LL;
typedef pair<int, int> PII;

PII ice[N];

bool cmp(PII a, PII b)
{
    return a.y*b.x > b.y*a.x;
}

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++ )
    {
        int t, d;
        scanf("%d%d", &t, &d);
        ice[i] = {t, d};
    }
    sort(ice + 1, ice + 1 + n, cmp);
    LL sum = 0;
    int t = 0;
    for(int i = 1; i <= n; i ++ )
    {
        sum += ice[i].y * t;
        t += ice[i].x;
    }
    cout << sum;
    return 0;
}
posted @ 2022-03-10 18:22  inss!w!  阅读(109)  评论(0编辑  收藏  举报