问题描述
一天,晨晨发现自己的 n(2≤n≤100)只兔子跑到自己的花园里面,它们在尽情的吃 着她的宝贝花卉。 晨晨看在眼里痛在心里,她现在只能把兔子逐个的抓回笼子里面。而送 每只兔子回去的时间都不同,例如送第 i 只兔子回去需要 ti(1≤ti≤100)单位时间,那么 晨晨送第 i 只兔子来回共需要花费 2*ti 单位时间,另外每一只兔子单位时间的破坏力都不 同,例如第 i 只兔子单位时间内破坏 di (1≤di≤100)朵花。
现在的问题是,晨晨如何安排送这 n 只兔子回笼子才能使这些兔子的破坏最小。
输入格式
第一行:一个整数 n(1≤n≤100);
接着有 n 行,每行两个空格分开的整数 ti di,分别代表第 i 只兔子的送回去的时间, 和单位时间破坏力。
输出格式
一行:一个整数,代表这些兔子破坏多少花卉。
输入样例
6
3 1
2 5
2 3
3 2
4 1
1 6
输出样例
86
题解
假设我们已知最优序列,那么最优序列中定然满足$d[2] imes t[1] imes 2 < d[1] imes t[2] imes 2$,得$frac {t[1]}{d[1]} < frac{t[2]}{d[2]}$,即$frac{t[i]}{d[i]}$为排序关键字,直接sort即可。

#include <iostream> #include <algorithm> using namespace std; struct Rabbit { int t, d; double v; friend inline bool operator < (Rabbit x, Rabbit y) { return x.v < y.v; } }; int n; Rabbit a[105]; int ans; int main() { cin >> n; for(register int i = 1; i <= n; ++i) { cin >> a[i].t >> a[i].d; a[i].v = (double)a[i].t / a[i].d; } sort(a + 1, a + n + 1); for(register int i = 1; i <= n; ++i) { a[i].t = 2 * a[i].t + a[i - 1].t; ans += a[i - 1].t * a[i].d; } cout << ans; return 0; }