【每日一题】【5月28日】Protecting the Flowers

Protecting the Flowers

https://ac.nowcoder.com/acm/problem/25043

题意:

头奶牛在践踏花田,第 头牛每分钟会毁坏 朵花,把第 头牛关进栅栏里需要 分钟。关进栅栏的过程中,不会毁坏花朵。
同一时间只能处理一头牛,问怎样安排可以使得被毁坏的花朵数目最少。

题解:

贪心。
比较典型的贪心题目。因为同一时间只能处理同一头牛,所以我们只需要确定顺序即可。
确定顺序再结合求最小,就可以想想是不是贪心

对于这类题:可以通过比较第 个和第 个,或者比较第 头牛或者第 个,怎样的顺序会更优。即确定一个偏序关系。

这里比较一下第 个和第 个的顺序。 这两部分的毁坏花朵数数与 的顺序无关。
记前 头牛处理完的时间为
那么若 排在 前面,这两头牛的毁坏数为
排在 前面,毁坏总数为
我们要排列后最优,即 前面优于 后面。
有:
化简一下,得到
因此按 从小到大排列即可。

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
struct Node {
    int t, d;
    bool operator < (const Node &b) const {
        return t * b.d < b.t * d;
    }
}a[N];
int n;
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i].t >> a[i].d;
    sort(a + 1, a + n + 1);
    long long ans = 0, tim = 0;
    for(int i = 1; i <= n; i++) {
        ans += tim * a[i].d;
        tim += 2 * a[i].t;
    } 
    cout << ans << endl;
    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务