题号 NC25043
名称 Protecting the Flower
来源 USACO英文版-2007 January Contest-Silver

解题思路

题目要求奶牛总共破坏的花朵最少,牵奶牛的顺序至关重要。

假设有两头奶牛 cow1cow2,如果先牵走第 1 头奶牛,那么破坏的花朵是 2 * cow1[0] * cow2[1],如果先牵第 2 头奶牛,共破坏花朵 2 * cow2[0] * cow1[1]
根据题意, 先牵破坏花朵少的对应的那头奶牛。

确定了牵奶牛的顺序,再计算花朵的总破坏量。
使用 sum 记录所有奶牛每分钟花朵破坏量,每牵走一头奶牛,减去其对应的破坏量。将 sum * cows[i][0] * 2 累计加入结果 ans

C++代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool comp(vector<int> &cow1, vector<int> &cow2){
    return cow1[0]*cow2[1] < cow2[0]*cow1[1];
}
int main(){
    int N;
    cin >> N;
    vector<vector<int>> cows(N, vector<int>(2));
    for(int i=0; i<N; ++i){
        cin >> cows[i][0] >> cows[i][1];
    }
    sort(cows.begin(), cows.end(), comp);
    long long sum = 0;
    for(int i=0; i<N; ++i){
        sum += cows[i][1];
    }

    long long ans = 0;
    for(int i=0; i<N-1; ++i){
        sum -= cows[i][1];
        ans += sum * cows[i][0] * 2;
    }
    cout << ans << endl;
    return 0;
}