地址 http://poj.org/problem?id=3262
题意
牛每秒钟吃Di的花朵,将牛赶回家需要时间Ti(来回时间乘以2)
询问以最优的次序将牛赶回家,损失的花朵数量。
输入 第一行输入一个数字N 下面输入N行数字 每行有两个空格隔开的数字表示一头牛赶回家需要的时间T和每秒吃掉的花朵D
输出一个数字 以最优的次序将牛赶回家,损失的花朵数量
解法
比率贪心
假设两头牛AB 赶回家的时间为TA 和TB ,每秒钟吃掉的花朵为DA和DB
如果先赶A牛回家 那么损失就是 DB*TA*2
如果先赶B牛回家 那么损失就是 DA*TB*2
我们需要赶损失较大的牛回家才能减少损失
那么将所有的牛 两两比较排序 比较函数为
struct ELE { int t; int d; }ele[N]; int n; bool cmp(const struct ELE& a, const struct ELE& b) { return (a.d * b.t) > (b.d * a.t); }
按照该次序赶牛回家 计算损失
// 1123555.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <algorithm> using namespace std; const int N = 100010; /* 6 3 1 2 5 2 3 3 2 4 1 1 6 */ struct ELE { int t; int d; }ele[N]; int n; bool cmp(const struct ELE& a, const struct ELE& b) { return (a.d * b.t) > (b.d * a.t); } int main() { cin >> n; long long destroy = 0; long long ans = 0; for (int i = 0; i < n; i++) { cin >> ele[i].t >> ele[i].d; destroy+= ele[i].d; } sort(ele,ele+n,cmp); for (int i = 0; i < n; i++) { destroy -= ele[i].d; ans += destroy * ele[i].t * 2; } cout << ans << endl; return 0; }