ADV-1181 搬运冰块(贪心)
问题描述
丑枫接到了一份奇葩的工作:往冰库里搬运冰块.冰库外放着N箱冰块,由于室外温度高,冰块会很快融化,且每箱冰块的融化速度不同.因为每箱冰块的体积,质量不等,把每箱冰块搬运进冰块花费的时间也不同.因此需要合理安排搬运顺序,才能使总的冰块融化量最小.丑枫请你帮忙计算最少的总融化量是多少,以便汇报上司.
输入格式
第一行输入整数N
接下来N行,每行两个整数,分别表示每箱冰块的搬运耗时Ti及融化速度Di.
输出格式
输出最少的总融化量
思路
结论:应该按照di*ti+1 > di+1*ti
的顺序排列冰块,融化的量才最小
证明:设第i个冰块搬运耗时ti,融化速度di, 第i+1个冰块搬运耗时ti+1,融化速度di+1
那么,将这两个冰块交换搬运顺序,考虑交换后融化的量为多少。
显然,交换这两个冰块不会影响其他冰块的融化量
#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;
}