题解 | #[USACO 2007 Jan S]Protecting the Flowers#
[USACO 2007 Jan S]Protecting the Flowers
https://ac.nowcoder.com/acm/problem/25043
贪心:
假设如果有两头牛,往返的时间分别是,每分钟摧毁的花是。
那么我们可以得出:
1.先牵第一头牛,消耗的总数为
2.先牵第二头牛,消耗的总数为
我们使第一种情况消耗总数最小,可以列出。
我们根据这个条件排序,再从头模拟就可以得出答案。
如果只考虑,那么我们可以根据上面的假设判断出,这是错误的想法。
如果,根据正确分析,应该牵第二头牛;如果只分析,我们应该选择第一头牛。
AC代码
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<int, int> a, pair<int, int> b)
{
return a.first * b.second < a.second * b.first;
}
int main(void)
{
int n;
cin >> n;
vector<pair<int, int>> mp(n);
for (int i = 0; i < n; i++)
cin >> mp[i].first >> mp[i].second;
sort(mp.begin(), mp.end(), cmp);
long long sum = 0, t = 0;
for (int i = 0; i < n; i++)
{
sum += t * mp[i].second;
t += 2 * mp[i].first;
}
cout << sum << endl;
}