YBT 拯救花园

问题描述

        一天,晨晨发现自己的 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;
}
参考程序
原文地址:https://www.cnblogs.com/kcn999/p/10801455.html